从JNI使用函数库时出错

时间:2012-11-23 13:38:12

标签: java

当我运行此代码时:

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

2 个答案:

答案 0 :(得分:1)

JNI不会那样工作。

您似乎正在尝试加载Windows运行时库(kernel32)并调用其FlushProcessWriteBuffers函数。你无法用JNI做到这一点。使用JNI,您只能调用根据the JNI specification编码和链接的特殊编写的本机函数。

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

您还可以考虑使用JNA,它有点像通用的包装函数,允许您调用任何本机函数,而无需编写自己的包装器。

答案 1 :(得分:-1)

看起来您正在尝试使用JNI来调用Windows系统函数。

为了实现这一点,您需要编写自己的C包装器,该包装器符合JNI命名约定,并在内部调用FlushProcessWriteBuffers()

或者,请查看JNA