欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

jna 从入门到快速开发(一)

程序员文章站 2022-03-05 13:36:12
...

前言:

       公司最近在做摄像头相关的业务,摄像头配套的软件,一般都是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版本来测试,选能用的版本。

 

相关标签: java实现 java