使用JNA调用c/c++的so动态库函数

本文介绍了如何通过Java Native Access (JNA) 跨平台调用C/C++编译的SO动态库函数。在Linux环境下,首先确保SO文件的LD_LIBRARY_PATH设置正确,然后在Java项目中引入JNA依赖。根据C头文件定义的函数接口,创建对应的Java结构体和方法。最后,通过Native.loadLibrary加载动态库并执行调用。注意,Windows系统需要使用DLL文件,且服务器重启后可能需要重新设置LD_LIBRARY_PATH。
摘要由CSDN通过智能技术生成

       最近项目收到个需求,需要调用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值