使用Java的JNative呼叫dll動態連結庫
阿新 • • 發佈:2018-12-07
1,首先下載JNative的庫,其中包含JNative.jar, JNativeCpp.dll, libJNativeCpp.so這三個包。
JNative.jar是需要匯入到Java工程的lib下。 通過Build Path即可匯入。 建議將JNative.jar放在jdk的jre\lib\ext檔案裡。
JNativeCpp.dll是必須放入到jdk的jre\bin檔案裡,否則就會報JNative找不到的錯誤。
libJNativeCpp.so是Linux作業系統的,由於沒有做過實驗,所以暫時不予說明。
2,由於 JNativeCpp.dll是32為windows程式,所以需要下載jdk 32位的版本才可以。(本人就是在這個上面浪費了一天的時間在除錯錯誤。)
3,將需要呼叫的dll動態連結庫放置到system32檔案裡,否則就會出現找不到dll檔案的錯誤。
4,在呼叫dll後需要通過JNative的setParameter()方法來給dll庫中所需要呼叫的函式傳參,由於方法的限制,在給dll函式中傳char[]是不成功的,因為setParameter()是不支援char[]型別的。而且在傳byte[]等這些引數的時候,需要將setParameter()第二個引數寫為Type.VOID。
5,下面是程式碼部分
//匯入JNative庫
import org.xvolks.jnative.Type;
//呼叫dll庫
JNative getUrl=null;
byte[] f1=null; //dll方法需要傳的引數
byte[] f2=null;
f1=f3.getBytes(); //f3 f4 為String
f2=f4.getBytes();
getUrl = new JNative("ARTH_DLL", "Match2Fp"); //呼叫dll庫,第一個引數為dll名字 第二個引數為dll庫中函式的名字
try {
getUrl.setRetVal(Type.INT); //定義函式返回值型別
} catch (IllegalAccessException e) {
e.printStackTrace();
}
try {
getUrl.setParameter(0, Type.VOID, f1); //傳遞引數,第一個引數為所呼叫的函式中的第幾個引數。 第二個引數為向多呼叫的函式中的傳參型別 第三個引數為傳遞的值
getUrl.setParameter(1, Type.VOID, f2);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
getUrl.invoke(); //執行所呼叫的函式
try {
i=getUrl.getRetValAsInt(); //獲取所呼叫的函式的返回值
System.out.print(String.valueOf(i));
} catch (IllegalAccessException e) {
e.printStackTrace();
}