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版本来测试,选能用的版本。

 

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