简介
因项目中使用的数据要经过一系列的算法处理,而算法是由传感器供应商提供的是C写的并且不开放算法,这就导致不用直接用java处理了。在这前提下搜索了大量资料,最开始用的是JNI找了很多资料踩了很多坑直接编译就不通过。后面使用JNA顺利调用成功,过程中踩坑浪费大量时间。现把过程都贴出来尽可能的让大家少踩坑。如果哪里有错误欢迎大佬指正。
步骤
1、动态库.dll/.so
1.1、生成动态库
生成.o文件。注意gcc跟jdk位数,jdk32位gcc也要安装32位,不然会报错。
gcc -Wall -c mydylib.c -o mydylib.o
# linux环境
gcc -shared -fPIC -o mydylib.so mydylib.o
#win环境
gcc -shared -fPIC -o mydylib.dll mydylib.o
2、导入maven库
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>4.2.2</version>
</dependency>
3、创建接口继承Library类
dll文件要放在resoures目录下,windows是.dll linux是.so文件。
3.1、调用:
调用可能出现的问题点:
1、不是一个应用程序:java调用的函数名跟C/C++声明的函数不一致
2、invalid memory access: C使用内存过大相关。
3.2、对应C文件入参
3.3、类型映射表
JNA官方提供的类型映射表