2012-11-23 52 views
0

的函数库当我运行这段代码:错误使用JNI从

package jni_2; 

public class Min2 { 

    static { 
     System.loadLibrary("kernel32"); 
    } 

    public native long FlushProcessWriteBuffers(); 

    public static void main(String[] args) { 
     Min2 c = new Min2(); 
     c.FlushProcessWriteBuffers(); 
    } 
} 

我得到这个异常:

Exception in thread "main" java.lang.UnsatisfiedLinkError: jni_2.Min2.FlushProcessWriteBuffers()J 
    at jni_2.Min2.FlushProcessWriteBuffers(Native Method) 
    at jni_2.Min2.main(Min2.java:14) 
Java Result: 1 
+0

请发布原生函数的(C)原型 – MByD

回答

1

JNI不会这样的。

看来您正在尝试加载Windows运行时库(kernel32)并调用其FlushProcessWriteBuffers函数。你不能用JNI来做到这一点。使用JNI,您只能调用专门编写的本地函数,根据the JNI specification进行编码和链接。

为了通过JNI调用FlushProcessWriteBuffers,您需要在C(或其他)中编写一个兼容JNI的包装函数,编译生成一个库,加载该库,然后进行本机调用。包装函数然后可以调用FlushProcessWriteBuffers

你也可以看看使用JNA,它有点像通用包装函数,允许你调用任何本地函数,而无需编写自己的包装器。

-1

它看起来像你试图使用JNI调用Windows系统函数。

为了达到这个目的,您需要编写自己的C封装器,以符合JNI命名约定,并且可以在内部调用FlushProcessWriteBuffers()

或者,看看JNA

+0

有什么比汤姆安德森的回答更好/不同? – Aubin

+0

@Aubin:我们几乎在同一时间提出了类似的答案。这一直发生在SO上,特别是当答案相当明显时。 – NPE