中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java如何調用dll文件

發布時間:2022-02-15 14:50:48 來源:億速云 閱讀:395 作者:小新 欄目:開發技術

這篇文章主要介紹Java如何調用dll文件,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

Java調用dll文件

近期根據C++做了一個圖片質量檢測的項目,目前需要在在java中進行調用,所以先在C++上生成dll文件,然后基于java調用dll文件實現功能。

環境

C++:VS2017(之前配置opencv真是要了老命)

java:idea2020+jdk1.8。

注意:jdk安裝的時候小心點,path路徑容易點編輯,千萬別新建,會覆蓋的。

Java如何調用dll文件

接下來進入正文

1. 創建Java項目,假設定義HelloWorld函數,其中“winproject1”是等會要調用的dll文件,現在進入cmd并cd到當前目錄下面,然后javah -jni HelloWorld.HelloWorld,這樣會在目錄下面生成一個HelloWorld_HelloWorld.h。

等會需要將這個頭文件移到之前安裝jdk目錄里的include下面,如:D:%你的路徑%\Java\include。

Java如何調用dll文件

Java如何調用dll文件

2. 打開vs2017,創建一下新的控制臺項目,然后需要配置項目包含目錄的路徑,將下面兩個路徑加進去,保險點還可以在附加目錄里面加上這些路徑。

vs2017中編寫上面頭文件中的代碼:

JNIEXPORT void JNICALL Java_HelloWorld_HelloWorld_sayHello (JNIEnv *, jobject, jstring, jstring, jstring, jstring) { cout<<"hello world!"<<endl; }

Java如何調用dll文件

Java如何調用dll文件

Java如何調用dll文件

**注:**其中#include "single_check.h"就是我定義檢測函數的頭文件,在下面的函數中可以調用自己定義的函數,從而讓java執行里面的內容,可以調用函數。

3.生成第一步中提到的winproject1.dll文件,直接點擊生成-生成解決方案,便可以在項目路徑(%項目名%\x64\Debug\winproject1.dll)中找到dll文件,并且復制到jdk安裝路徑的bin文件夾下(D:%你的路徑%\Java\bin\)

4.最后一步最簡單啦,在java里面直接run就行啦。最后看一下結果!完美!

Java如何調用dll文件

Java如何調用dll文件

這是windows下用java調用dll文件,接下來要實現跨平臺調用,得在linux下用java可以實現改功能。頭禿啊

Java調用dll文件幾種常見方式

Java調用動態庫需要關注的問題

1.如何裝載DLL文件,以及如何定位所要使用的方法;

2.數據類型如何對應;

3.如何給使用的方法傳遞參數;

4.如何獲取返回的值。

一.數據類型對應關系

Java TypeC Type
booleanint
bytechar
charwchar_t
shortshort
doubledouble
floatfloat
Stringchar*

二.Jnative調用dll

Jnative是對JNI技術進行了封裝,更加方便的讓java去調用DLL。

1. 下載Jnative庫,其中包含JNative.jar, JNativeCPP.dll, JNativeCPP.so這三個包。 JNative.jar是需要導入到Java工程的lib下, JNativeCPP.dll文件放在jdk安裝目錄下,或者是user\System32目錄下,或者項目根目錄下。

2. 將需要調用的dll動態鏈接庫放在SYSTEM32文件夾下,或者是項目根目錄下,否則會出現找不到dll文件的錯誤。

3. 加載DLL庫 : System.loadLibrary("TranferEth"); // TransferEth為需要調用的DLL文件,只需要使用DLL文件的文件名即可。

4. 調用DLL入口函數 : JNative jnt = new JNative("TransferEth.dll", "Transfer_Ethernet"); // 參數1為需要調用的DLL文件, 參數2為需要調用的方法。

5. 設置返回參數類型 : jnt.setVal(Type.INT);

6. 設置傳入參數 : jnt.setParameter(0, "TransferScale.ini");

7. 執行調用 : jnt.invoke();

8. 釋放資源 : jnt.dispose();

三.JNA調用dll  

JJNA中,它提供了一個動態的C語言編寫的轉發器,可以自動實現Java和C的數據類型映射。你不再需要編寫C動態鏈接庫。  

1.在java項目中引入jna.jar。 (當前引用的版本為3.4.0 , 之前的版本未提供釋放動態鏈接庫資源的方法)

2.定義調用接口, 接口方法與需要調用的DLL提供的外部函數一致。

例如:DLL文件中提供入口函數:

extern "C" __declspec(dllexport) UINT __stdcall Transfer_Ethernet_EX(char *cTransScale , int nKey);
extern "C" __declspec(dllexport) UINT __stdcall Transfer_Ethernet(char *cTransScale );

則定義的接口類中如下:  (數據類型對應關系如上)

public interface CallMTScaleLibrary extends Library {  
    public int Transfer_Ethernet_EX(String filename, int key);     
    public int Transfer_Ethernet(String filename); 
}

3.加載DLL文件

String dir = path + "dllName";  // dll文件的路徑,可以省略后綴名,dll和so后綴都可以加載
CallMTScaleLibrary scaleLibrary =  (CallMTScaleLibrary) Native.loadLibrary(dir, CallMTScaleLibrary.class);

4.執行調用

int result = scaleLibrary.Transfer_Ethernet(path + "TransferScale.ini");

5.釋放資源

一次調用完成后需要釋放掉資源,以便后續重復調用該資源。通過查看jna的源碼Native類中有私有方法dispose()可以主動釋放掉資源,可以通過反射的方式去調用該方法,也可以重寫該方法,從而實現釋放。

private static void  dispose(){
           NativeLibrary.disposeAll();         
           nativeLibraryPath = null;
}

注意問題:

1.文件路徑:DLL文件最好放在項目的根目錄下,或者是system32文件夾下,必須在環境變量配置的path中。                 

2.循環調用:當循環調用同一個DLL文件時,必須要釋放掉上一次的資源,否則會被占用端口(每次調用都會在線程里進行一次網絡通訊)。 

以上是“Java如何調用dll文件”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

突泉县| 松江区| 赤水市| 农安县| 海安县| 唐山市| 多伦县| 乐至县| 朝阳县| 洪江市| 萝北县| 绥德县| 时尚| 普兰店市| 蓬安县| 通渭县| 麻阳| 沙河市| 浙江省| 昌乐县| 旅游| 井陉县| 新乐市| 巩留县| 绿春县| 广宁县| 大连市| 阜康市| 那坡县| 余姚市| 灵武市| 炉霍县| 神池县| 泸定县| 泊头市| 雷山县| 东港市| 济源市| 公主岭市| 亚东县| 阿拉尔市|