2012-11-23 54 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