jna 從入門到快速開發(一)

前言:

       公司最近在做攝像頭相關的業務,攝像頭配套的軟件,一般都是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版本來測試,選能用的版本。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章