0

当我运行此代码时:

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
4

2 回答 2

1

JNI 不是这样工作的。

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

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

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

于 2012-11-23T14:04:09.267 回答
-1

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

为此,您需要编写自己的 C 包装器,该包装器将符合 JNI 命名约定,并在内部调用FlushProcessWriteBuffers().

或者,看看JNA

于 2012-11-23T14:05:58.557 回答