1. 程式人生 > >Java通過JNI 呼叫動態連結庫DLL

Java通過JNI 呼叫動態連結庫DLL

JNI(Java Native Interface)Java本地介面,主要作用是實現java程式碼與C、C++編寫的程式碼互動。

在Android程式設計中,so庫的訪問也用到了jni技術。

理論多說無益,還是看java連線dll的實戰吧。如下:

例:java中呼叫demo.dll檔案中的 hello()方法。

1、java

1)裝載dll檔案
     有兩種方式System.load();和System.loadLibrary();
     load需要全路徑且需要有副檔名;
     loadLibrary是特定路徑,系統system32下或專案bin目錄下,只要檔名稱不要.dll副檔名。
2)本地宣告方法
    裝載完dll檔案後,將使用的方法用native關鍵字宣告。
public class ConnectDemoDll{
    static{
        System.load("c://demo.dll");
        //或者
        //System.loadLibrary("demo");
    }
    public native static void hello();
}
3)生成.h標頭檔案
    首先使用javac ConnectDemoDll.java生成.class檔案,再使用javah ConnectDemoDll命令生成.h標頭檔案
#include<stdio.h>  
#include<ConnectDemoDll.h>  
JNIEXPORT void JNICALL JAVA_ConnectDemoDll_hello(JNIEnv *env,jobject obj);

生成的標頭檔案中方法命名為:java類的完整路徑_方法(中間下劃線分割)

注意:如果專案中呼叫現成的dll檔案,我們必須知道C中方法的宣告,並在java程式中建立對應的包結構,如果路徑不對應,執行java程式時就會報錯。當包名調整了之後,請重新編譯對應的dll檔案。

2、C
根據生成的.h標頭檔案,實現所有的方法即可。

注:一般專案中dll檔案都是本來就有的,說白了就是一開始就有編譯好了的dll檔案,在java中呼叫時一定要確保java類的包路徑和類名,要與dll對應的方法全名路徑一致,否則會出錯。