前言:
公司最近在做攝像頭相關的業務,攝像頭配套的軟件,一般都是C++寫的,windows的動態鏈接庫.dll文件,以及linux下的.so文件。剛開始接觸這個的時候,真的是頭疼,找不到一個簡單暴力的教程教我怎麼用Java對接它們,遇到的問題也只能百度一個一個搜。現在項目開發告一段落(前前後後對接了三個攝像頭設備的sdk,百來個方法),對jna有一定程度上的掌握了,整理成筆記。
ps:這段期間用Jna開發大部分功能都順利實現了,就碰到過一種情況,貌似只能用jni解決,以後有空再出Jni的教程
正文:
Jna是Java用來對接動態鏈接庫的一個庫。先放出一個簡單的demo,下載下來直接運行就ok,運行環境 jdk8(64位) ,必須64位。 (如果將來開發中要對接x86的32位動態鏈接庫,就必須用32位的jdk !!!!!)
碼雲地址:https://gitee.com/lllyl2012/jnaDemo/tree/master/src/main/java/top
以下是該demo的開發步驟。
步驟一:
將要對接的hello.dll文件,丟入到項目的根路徑下
步驟二:
創建用於對接hello.dll文件的java類 ----- JnaSDK.java,代碼如下:
該dll只有一個方法,就是Add,將兩個數字相加。這個方法的返回值、入參、方法名 都與.dll中的一一對應。(一般.dll的提供商會提供文檔,或者.h的頭文件,這兩樣東西里都會有關於方法簽名的描述)
package top;
import com.sun.jna.Library;
public interface JnaSDK extends Library {
int Add(int a,int b);
}
步驟三:
開始調用這個方法,編寫一個新的類JnaDemo,代碼和註釋如下:
代碼要兼容windows和Linux,所以實例化JnaSDK的時候務必這麼寫。
package top;
import com.sun.jna.Native;
public class JnaDemo {
//根據環境獲得hello.dll或者hello.so文件,並以此獲得JnaSDK的實例
private static JnaSDK jnaSDK = (JnaSDK)(System.getProperty("os.name").toLowerCase().startsWith("win")? Native.loadLibrary("hello.dll",JnaSDK.class):Native.loadLibrary("hello.so",JnaSDK.class));
public static void main(String[] args) {
//直接調用方法
System.out.println(jnaSDK.Add(1,4));
}
}
執行結果:5
可能會碰到的問題:
1、這個demo項目中只給出了.dll文件,.so文件沒給出,所以請在windows下運行
2、jdk一定要用64位的,因爲這個dll文件是64位的
3、pom.xml中給出的jna版本是5.5.0,是目前(2020-3-28)最新的版本,根據我目前開發過來的三個sdk情況來看,不同jna版本之間的使用效果並不一樣!!!在實際的公司的項目開發中,出現問題可以多切換幾個Jna版本來測試,選能用的版本。