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版本来测试,选能用的版本。
推荐阅读
-
从能做什么到如何去做,一文带你快速掌握Python编程基础与实战
-
《Visual C# 从入门到精通》第一章使用变量、操作符和表达式——读书笔记
-
Docker从入门到掉坑(五):继续挖一挖 k8s
-
MyBatis从入门到精通(十一):MyBatis高级结果映射之一对多映射
-
Excel 2016表格转换实现数据快速从二维表到一维表的转换
-
JAVA WEB快速入门之从编写一个基于SpringBoot+Mybatis快速创建的REST API项目了解SpringBoot、SpringMVC REST API、Mybatis等相关知识
-
nodeJS从入门到进阶(一)
-
记一个复杂组件(Filter)的从设计到开发
-
一统江湖的大前端(7)React.js-从开发者到工程师
-
【教程】ThingJS 3D开发快速入门 第一讲 开发概述·优势·项目流程