1. 程式人生 > >使用Java的JNative呼叫dll動態連結庫

使用Java的JNative呼叫dll動態連結庫

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.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();
}