<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
近期根據C++做了一個圖片質量檢測的專案,目前需要在在java中進行呼叫,所以先在C++上生成dll檔案,然後基於java呼叫dll檔案實現功能。
C++:VS2017(之前設定opencv真是要了老命)
java:idea2020+jdk1.8。
注意:jdk安裝的時候小心點,path路徑容易點編輯,千萬別新建,會覆蓋的。
1. 建立Java專案,假設定義HelloWorld函數,其中“winproject1”是等會要呼叫的dll檔案,現在進入cmd並cd到當前目錄下面,然後javah -jni HelloWorld.HelloWorld,這樣會在目錄下面生成一個HelloWorld_HelloWorld.h。
等會需要將這個標頭檔案移到之前安裝jdk目錄裡的include下面,如:D:%你的路徑%Javainclude。
2. 開啟vs2017,建立一下新的控制檯專案,然後需要設定專案包含目錄的路徑,將下面兩個路徑加進去,保險點還可以在附加目錄裡面加上這些路徑。
vs2017中編寫上面標頭檔案中的程式碼:
JNIEXPORT void JNICALL Java_HelloWorld_HelloWorld_sayHello (JNIEnv *, jobject, jstring, jstring, jstring, jstring) { cout<<"hello world!"<<endl; }
**注:**其中#include "single_check.h"就是我定義檢測函數的標頭檔案,在下面的函數中可以呼叫自己定義的函數,從而讓java執行裡面的內容,可以呼叫函數。
3.生成第一步中提到的winproject1.dll檔案,直接點選生成-生成解決方案,便可以在專案路徑(%專案名%x64Debugwinproject1.dll)中找到dll檔案,並且複製到jdk安裝路徑的bin資料夾下(D:%你的路徑%Javabin)
4.最後一步最簡單啦,在java裡面直接run就行啦。最後看一下結果!完美!
這是windows下用java呼叫dll檔案,接下來要實現跨平臺呼叫,得在linux下用java可以實現改功能。頭禿啊
1.如何裝載DLL檔案,以及如何定位所要使用的方法;
2.資料型別如何對應;
3.如何給使用的方法傳遞引數;
4.如何獲取返回的值。
Java Type | C Type |
---|---|
boolean | int |
byte | char |
char | wchar_t |
short | short |
double | double |
float | float |
String | char* |
Jnative是對JNI技術進行了封裝,更加方便的讓java去呼叫DLL。
1. 下載Jnative庫,其中包含JNative.jar, JNativeCPP.dll, JNativeCPP.so這三個包。 JNative.jar是需要匯入到Java工程的lib下, JNativeCPP.dll檔案放在jdk安裝目錄下,或者是userSystem32目錄下,或者專案根目錄下。
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();
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檔案時,必須要釋放掉上一次的資源,否則會被佔用埠(每次呼叫都會線上程裡進行一次網路通訊)。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45