個人習(xí)慣晶乔,飲水思源族铆。先丟我學(xué)習(xí)視頻地址:Java使用JNA調(diào)用C/C++動態(tài)鏈接庫dll
以下為學(xué)習(xí)總結(jié),注釋為臨時的個人理解,并沒有百度"求證"
視頻中有如何調(diào)用Windows系統(tǒng)中自帶的DLL的方法。
本文并沒有總結(jié),有自定義讲坎、以及如何調(diào)用就差不多,以后的路得靠自己慢慢踩坑摸索了
總之愧薛,這樣可以有效得擴展Java不能操作內(nèi)存之類得弊端晨炕,順便學(xué)點C++(C)也是不錯地~
開發(fā)環(huán)境
1、win10 64位 i7 8750H 16G
2毫炉、Visual Studio Community 2019(下面簡稱VS)
3瓮栗、IntelliJ IDEA 2019.3.3 (Ultimate Edition)(下面簡稱IDEA)
4、jdk1.8(64位)
開發(fā)準(zhǔn)備
- 安裝自定義dll動態(tài)庫必要的環(huán)境
選 使用C++的桌面開發(fā) 即可
使用C++的桌面開發(fā)
自定義動態(tài)鏈接庫(DLL)
一瞄勾、創(chuàng)建具有導(dǎo)出項的動態(tài)鏈接庫項目
說直白點费奸,就是等會Java調(diào)用的dll文件
vs創(chuàng)建項目快捷鍵 Ctrl + Shift + N
或者看下圖
名字隨便取,然后點創(chuàng)建
就在這里面擼代碼进陡,有C++(C)基礎(chǔ)的愿阐,一看就知道自動生成的代碼啥意思
二、擼自定義dll中的方法
后面會有"大量代碼"趾疚,不知道代碼加哪里的缨历,看截圖。糙麦。辛孵。
這里就和Java中的接口(interface)有些相似,等會也會用到Java中的接口(interface)
- 在TestDll.cpp中添加一個兩數(shù)相加的方法
#include <iostream>
#include <stdio.h>
TESTDLL_API int add(int a, int b) {
int value = a + b;
// c++:cout打印 << 相當(dāng)于是 Java中字符串相加 end結(jié)束 endl 結(jié)束并且換行
cout << "C++打印: TestDll add: " << value << endl;
// c 打印
printf("C打印:TestDll add: %d", value);
return value;
}
- 在TestDll.h中聲明add這個方法
這里extern "C" 的意思是赡磅,告訴編譯器最終以C的形式去編譯
extern "C" TESTDLL_API int add(int a, int b);
到這里觉吭,一個簡單的含有add方法的Dll動態(tài)庫內(nèi)部代碼就寫完了,接下來是生成DLL
三仆邓、生成DLL
這里注意!
因為我jdk安裝的是64位的伴鳖,所以生成的Dll也要是64的
- 配置vs(vs默認(rèn)32位)节值,切換成x64就好了
- 生成DLL文件
快捷鍵 F6
或者看下圖
紅框中的就是DLL生成存放的路徑
我們?nèi)フ业剿?/p>
到此,自定義DLL就結(jié)束了榜聂,下面總結(jié)Java通過JNA調(diào)用DLL
Java調(diào)用DLL動態(tài)鏈接庫
一搞疗、新建一個普通的Java項目
這里就不說了,直接跳過须肆。匿乃。桩皿。有個main就行。幢炸。泄隔。
并將我們自己生成的dll復(fù)制到項目中,最終結(jié)構(gòu)(純屬個人習(xí)慣宛徊,放哪里隨你便)如下圖
補充說明:小地雷③JNA.jar
二佛嬉、封裝DLL的調(diào)用接口
其中
int add(int a, int b);
就是自定義DLL中的方法接口
埋個小地雷①!看最后闸天!
public interface MyDll extends Library {
MyDll MY_DLL = Native.load((MyDll.class.getClassLoader().getResource("dll/TESTDLL.dll").getPath()).substring(1), MyDll.class);
/**
* Dll中的方法
*
* @param a 參數(shù)
* @param b 參數(shù)
* @return a + b
*/
int add(int a, int b);
}
三暖呕、調(diào)用封裝的DLL接口
調(diào)用并運行
public static void main(String[] args) {
int add = MyDll.MY_DLL.add(1, 1);
System.out.println("Java:" + add);
}
四、最終輸出結(jié)果
最后-挖地雷
小地雷①:Java最終輸出結(jié)果為亂碼
解決辦法:在vs中配置文件編碼
小地雷②:Java運行報錯苞氮,不是有效的的win32 應(yīng)用程序
解決辦法:回到上面 自定義動態(tài)鏈接庫(DLL) 中的 生成DLL文件
小地雷③JNA.jar:創(chuàng)建maven項目
添加JNA相關(guān)依賴
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.5.0</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
<version>5.5.0</version>
</dependency>