前言
java作爲一種開源語言與C++編譯和運行過程有着本質的不同,然而在java語言裏是可以調用C/C++動態鏈接庫的,常用的技術手段有jni和jna。
jni與jna比較
相比較而言,jni使用複雜,jna使用簡單。
jni(Java Native Interface java本地接口):如果有一個現有的.dll/.so文件,使用JNI技術調用,我們首先需要另外使用C語言寫一個.dll/.so共享庫,使用SUN規定的數據結構替代C語言的數據結構,調用已有的 dll/so中公佈的函數。然後再在Java中載入這個適配器dll/so,再編寫Java native函數作爲dll中函數的代理。經過2個繁瑣的步驟才能在Java中調用本地代碼。因此,很少有Java程序員願意編寫調用dll/.so庫中的原生函數的java程序。這也使Java語言在客戶端上乏善可陳。可以說JNI是Java的一大弱點!
jna(Java Native Access java本地訪問):提供一組Java工具類用於在運行期動態訪問系統本地庫(native library:如Window的dll,Android的so)而不需要編寫任何Native/JNI代碼。開發人員只要在一個Java接口中描述目標native library的函數與結構,JNA將自動實現Java接口到native function的映射。
性能比較:jni > jna,實驗參考https://blog.csdn.net/drifterj/article/details/7841810
綜上比較我們採用jna技術實現調用動態庫。在maven工程pom文件中配置jna依賴即可,版本信息可點擊主頁查看發佈的最新版本號:
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.3.1</version>
</dependency>
jna github主頁:https://github.com/java-native-access/jna
開發前準備
以下工具用來進行調試前對所需引用的動態庫進行依賴查看,防止出現找不到指定模塊的異常,使用方法暫且可以不看,後續使用過程中再來詳查。
系統 平臺 |
描述 | 工具名稱 | 使用方法 |
linux |
依賴 查看 |
qt命令行工具 |
1.打開qt命令行工具,如下圖所示; 2.進入動態庫所在目錄; 3.使用windeployqt xxx.so直接複製當前庫依賴,xxx.so爲自己的庫 |
windows |
depends.exe
|
1.打開軟件 2.直接拖拽動態庫dll文件至軟件 |
工具下載:
【depends.exe】鏈接:https://pan.baidu.com/s/13pRu5SF1R_r2swVnAsaNtQ 提取碼:9iss
【qtcreator自帶msvc2017和mingw-x64編譯器】 鏈接:https://pan.baidu.com/s/1kJ69v4bU44ZDb23tFrdlLA 提取碼:dgq1