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を呼び出そうとしているようです。FlushProcessWriteBuffersJNIではできません。JNI では、JNI 仕様に従ってコード化およびリンクされた、特別に作成されたネイティブ関数のみを呼び出すことができます。

JNI 経由で呼び出すFlushProcessWriteBuffersには、JNI 互換のラッパー関数を C (またはその他) で記述し、それをコンパイルしてライブラリを生成し、そのライブラリをロードして、ネイティブ呼び出しを行う必要があります。その後、ラッパー関数は を呼び出すことができますFlushProcessWriteBuffers

また、汎用ラッパー関数のように機能するJNAの使用を検討することもできます。これにより、独自のラッパーを作成しなくてもネイティブ関数を呼び出すことができます。

于 2012-11-23T14:04:09.267 に答える
-1

JNI を使用して Windows システム関数を呼び出そうとしているようです。

これを機能させるには、JNI 命名規則に準拠し、内部で を呼び出す独自の C ラッパーを作成する必要がありますFlushProcessWriteBuffers()

または、 JNAを見てください。

于 2012-11-23T14:05:58.557 に答える