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對應的方法全名路徑一致,否則會出錯。
補充知識:jni操作中java呼叫dll檔案部署失效問題
vs釋出dll版本時,沒有選擇release版本,而是用的debug版本,導致可能找不到需要依賴的dll
<audio controls="controls" style="display: none;"></audio>
以上這篇Java通過JNI 呼叫動態連結庫DLL操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。