最近项目收到个需求,需要调用c写的函数,给的是so文件,查阅了资料,so文件为linux下的动态库函数文件,windos下为dll文件。传统方案用JNI方式进行连接,大致看了下JNI方式实在麻烦,崩溃中找到JNA,并成功实现了调用,特此记录使用过程。
一、将so文件放在linux服务器下,并且指定export LD_LIBRARY_PATH路径为你的so文件放置路径(so文件需要前缀lib,因为jna为去动态库中匹配lib前缀的so文件,如libcompress.so)
我这边放置在/etc/profile
vim /etc/profile然后设置
export LD_LIBRARY_PATH=你的so文件放置路径
编写好后执行:source /etc/profile使之生效
二、maven导入jna包
<!-- https://mvnrepository.com/artifact/com.sun.jna/jna -->
<dependency>
<groupId>com.sun.jna</groupId>
<artifactId>jna</artifactId>
<version>3.0.9</version>
</dependency>
三、根据c提供的头文件看需要调用的方法和其参数,在java下创建
c中格式如下:
#define uint8_t unsigned char
#define uint16_t unsigned short
#define COMPRESS_IR_MAX_DIF_VAL (255) //the max different value of the ir data
#define COMPRESS_INDEX_LEN_3 (3)
#define COMPRESS_INDEX_LEN_4 (4)
#define COMPRESS_INDEX_LEN_5 (5)
#define COMPRESS_INDEX_LEN_6 (6)
#define COMPRESS_INDEX_LEN_7 (7)
#define COMPRESS_INDEX_LEN_8 (8)
#define COMPRESS_VAGUE_MAX_VALUE (20)//样品数据最大模糊值
#define COMPRESS_SRC_DATA_DIVIDE_VAL (5)//原数据整除值
typedef struct
{
uint16_t freq; //frequency
int *srcData; //sourdata pointer
uint16_t srcSize; //source data size
uint16_t *diffData; //different value buffer pointer
uint8_t diffSize; //different value count
uint8_t *indexBuf; //index buffer pointer
uint16_t indexBuf