欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java調(diào)用dll文件的實(shí)現(xiàn)解析

 更新時(shí)間:2022年02月15日 11:49:16   作者:favorxin  
這篇文章主要介紹了Java調(diào)用dll文件的實(shí)現(xiàn)解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Java調(diào)用dll文件

近期根據(jù)C++做了一個(gè)圖片質(zhì)量檢測(cè)的項(xiàng)目,目前需要在在java中進(jìn)行調(diào)用,所以先在C++上生成dll文件,然后基于java調(diào)用dll文件實(shí)現(xiàn)功能。

環(huán)境

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

java:idea2020+jdk1.8。

注意:jdk安裝的時(shí)候小心點(diǎn),path路徑容易點(diǎn)編輯,千萬(wàn)別新建,會(huì)覆蓋的。

接下來(lái)進(jìn)入正文

1. 創(chuàng)建Java項(xiàng)目,假設(shè)定義HelloWorld函數(shù),其中“winproject1”是等會(huì)要調(diào)用的dll文件,現(xiàn)在進(jìn)入cmd并cd到當(dāng)前目錄下面,然后javah -jni HelloWorld.HelloWorld,這樣會(huì)在目錄下面生成一個(gè)HelloWorld_HelloWorld.h。

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

2. 打開(kāi)vs2017,創(chuàng)建一下新的控制臺(tái)項(xiàng)目,然后需要配置項(xiàng)目包含目錄的路徑,將下面兩個(gè)路徑加進(jìn)去,保險(xiǎn)點(diǎn)還可以在附加目錄里面加上這些路徑。

vs2017中編寫(xiě)上面頭文件中的代碼:

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

**注:**其中#include "single_check.h"就是我定義檢測(cè)函數(shù)的頭文件,在下面的函數(shù)中可以調(diào)用自己定義的函數(shù),從而讓java執(zhí)行里面的內(nèi)容,可以調(diào)用函數(shù)。

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

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

這是windows下用java調(diào)用dll文件,接下來(lái)要實(shí)現(xiàn)跨平臺(tái)調(diào)用,得在linux下用java可以實(shí)現(xiàn)改功能。頭禿啊

Java調(diào)用dll文件幾種常見(jiàn)方式

Java調(diào)用動(dòng)態(tài)庫(kù)需要關(guān)注的問(wèn)題

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

2.數(shù)據(jù)類型如何對(duì)應(yīng);

3.如何給使用的方法傳遞參數(shù);

4.如何獲取返回的值。

一.數(shù)據(jù)類型對(duì)應(yīng)關(guān)系

Java TypeC Type
booleanint
bytechar
charwchar_t
shortshort
doubledouble
floatfloat
Stringchar*

二.Jnative調(diào)用dll

Jnative是對(duì)JNI技術(shù)進(jìn)行了封裝,更加方便的讓java去調(diào)用DLL。

1. 下載Jnative庫(kù),其中包含JNative.jar, JNativeCPP.dll, JNativeCPP.so這三個(gè)包。 JNative.jar是需要導(dǎo)入到Java工程的lib下, JNativeCPP.dll文件放在jdk安裝目錄下,或者是user\System32目錄下,或者項(xiàng)目根目錄下。

2. 將需要調(diào)用的dll動(dòng)態(tài)鏈接庫(kù)放在SYSTEM32文件夾下,或者是項(xiàng)目根目錄下,否則會(huì)出現(xiàn)找不到dll文件的錯(cuò)誤。

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

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

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

6. 設(shè)置傳入?yún)?shù) : jnt.setParameter(0, "TransferScale.ini");

7. 執(zhí)行調(diào)用 : jnt.invoke();

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

三.JNA調(diào)用dll  

JJNA中,它提供了一個(gè)動(dòng)態(tài)的C語(yǔ)言編寫(xiě)的轉(zhuǎn)發(fā)器,可以自動(dòng)實(shí)現(xiàn)Java和C的數(shù)據(jù)類型映射。你不再需要編寫(xiě)C動(dòng)態(tài)鏈接庫(kù)。  

1.在java項(xiàng)目中引入jna.jar。 (當(dāng)前引用的版本為3.4.0 , 之前的版本未提供釋放動(dòng)態(tài)鏈接庫(kù)資源的方法)

2.定義調(diào)用接口, 接口方法與需要調(diào)用的DLL提供的外部函數(shù)一致。

例如:DLL文件中提供入口函數(shù):

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

則定義的接口類中如下:  (數(shù)據(jù)類型對(duì)應(yīng)關(guān)系如上)

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.執(zhí)行調(diào)用

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

5.釋放資源

一次調(diào)用完成后需要釋放掉資源,以便后續(xù)重復(fù)調(diào)用該資源。通過(guò)查看jna的源碼Native類中有私有方法dispose()可以主動(dòng)釋放掉資源,可以通過(guò)反射的方式去調(diào)用該方法,也可以重寫(xiě)該方法,從而實(shí)現(xiàn)釋放。

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

注意問(wèn)題:

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

2.循環(huán)調(diào)用:當(dāng)循環(huán)調(diào)用同一個(gè)DLL文件時(shí),必須要釋放掉上一次的資源,否則會(huì)被占用端口(每次調(diào)用都會(huì)在線程里進(jìn)行一次網(wǎng)絡(luò)通訊)。 

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

  • SpringBoot的@Value給靜態(tài)變量注入application.properties屬性值

    SpringBoot的@Value給靜態(tài)變量注入application.properties屬性值

    這篇文章主要介紹了SpringBoot的@Value給靜態(tài)變量注入application.properties屬性值,Spring是一個(gè)開(kāi)源的框架,主要是用來(lái)簡(jiǎn)化開(kāi)發(fā)流程,通過(guò)IOC,依賴注入(DI)和面向接口實(shí)現(xiàn)松耦合,需要的朋友可以參考下
    2023-05-05
  • Java方法的返回值及注意事項(xiàng)小結(jié)

    Java方法的返回值及注意事項(xiàng)小結(jié)

    這篇文章主要介紹了Java方法的返回值及注意事項(xiàng),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • 一篇文章帶你玩轉(zhuǎn)go語(yǔ)言的接口

    一篇文章帶你玩轉(zhuǎn)go語(yǔ)言的接口

    這篇文章主要介紹了go語(yǔ)言的接口,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧,希望能夠給你帶來(lái)幫助
    2021-09-09
  • 深入了解Maven Settings.xml文件的結(jié)構(gòu)和功能

    深入了解Maven Settings.xml文件的結(jié)構(gòu)和功能

    這篇文章主要為大家介紹了Maven Settings.xml文件基本結(jié)構(gòu)和功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • java局域網(wǎng)聊天小程序

    java局域網(wǎng)聊天小程序

    這篇文章主要為大家詳細(xì)介紹了java局域網(wǎng)聊天小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • CentOS7和8中安裝Maven3.8.4的簡(jiǎn)單步驟

    CentOS7和8中安裝Maven3.8.4的簡(jiǎn)單步驟

    maven是屬于apache的一個(gè)工具,主要是對(duì)java進(jìn)行編譯打包,解決依賴關(guān)系,下面這篇文章主要給大家介紹了關(guān)于CentOS7和8中安裝Maven3.8.4的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • SpringBoot獲取配置文件內(nèi)容的幾種方式總結(jié)

    SpringBoot獲取配置文件內(nèi)容的幾種方式總結(jié)

    大家都知道SpringBoot獲取配置文件的方法有很多,下面這篇文章主要給大家介紹了關(guān)于SpringBoot獲取配置文件內(nèi)容的幾種方式,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • 將字符串?dāng)?shù)字格式化為樣式1,000,000,000的方法

    將字符串?dāng)?shù)字格式化為樣式1,000,000,000的方法

    這篇文章主要介紹了將字符串?dāng)?shù)字格式化為樣式1,000,000,000的方法,有需要的朋友可以參考一下
    2014-01-01
  • java圖形界面編程實(shí)戰(zhàn)代碼

    java圖形界面編程實(shí)戰(zhàn)代碼

    這篇文章主要介紹了java圖形界面編程實(shí)戰(zhàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 最新評(píng)論