Java使用jni在Linux环境下调用so文件

项目场景:

最近项目需要开发一个新功能,需要调用c++的so文件,在实际开发过程中碰到了一些问题,记录一下。


一、使用技术

原本是想直接用jna的,但是我们硬件提供的so文件用jna一直调用不到,于是就打算使用java自带的jni来调用。此项目无法在Windows环境下运行,只能在Linux环境。

二、使用步骤

1.编写一个类用于解析so文件

代码如下:

package com.sunson.driver;

public class dukpt {

    public native String generateUnlockCode(String A, String B);
    static{

    	   System.loadLibrary("dukpt");
    }

}

注意此处的包名,需要和so文件的头相同,所以必须创建相同的包名以及类名。

2.项目部署

1.将so文件保存在Linux系统,我保存的路径和之前类的包名是一样的(好像保存路径可以和包名的地址不一致,我没有尝试)。
so文件存放地址

2.使用 export LD_LIBRARY_PATH= so文件的地址 命令指定动态链接库,如果没有指定的话,会找不到so文件。
指定动态链接库我的系统的默认路径实在usr/local/lib,但是我把so文件放在下面还是找不到。
export 命令只是在当前这次登录下有效,如果重新打开了xshell还得重新再设置一遍。如果不想每次都设置,可以将该 LD_LIBRARY_PATH 的 export 语句写到系统文件中,例如 /etc/profile、/etc/export、~/.bashrc 或者 ~/.bash_profile 等等,这取决于你正在使用的操作系统。
可以使用echo $LD_LIBRARY_PATH查看地址。
3.运行你的项目
结果成功运行!

3.注意事项(可能出现的错误)

3.1版本不一致

可以在Linux环境下使用file [文件名]来查看当前so文件的版本是不是和当前系统一致。
`查看版本

3.2 运行环境

我在Windows环境是一直都调不起来,试了Jna框架在Windows环境下也是运行不了。
错误代码:

java.lang.UnsatisfiedLinkError: no dukpt in java.library.path
	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
	at java.lang.Runtime.loadLibrary0(Runtime.java:870)
	at java.lang.System.loadLibrary(System.java:1122)
	at com.sunson.driver.dukpt.<clinit>(jdukptTest.java:7)
Exception in thread "main" 
Process finished with exit code 1

3.3 没有配置动态链接库地址(LD_LIBRARY_PATH)

可以使用echo $LD_LIBRARY_PATH查看地址。
如果没有指定的话,
.使用 export LD_LIBRARY_PATH= so文件的地址 命令指定动态链接库

3.4 文件名

生成的so文件是lib前缀的,在java解析时文件名不用加lib,运行时自动会加上lib。

3.5 函数名不正确

可以使用nm [文件名] 查看so文件中的函数名和Java中调用的函数名是否一致。
主要是.h文件中没有加extern "C"导致函数名会加上前缀。

总结

以上就是今天要讲的内容,本文仅仅简单介绍了Java对so文件的调用,不同的so文件可能操作会不一样,之前下载了一个实例进行测试,没有修改任何地方,单纯的跑了一下,结果也能成功调用。但是当调用公司提供的so文件时就一直在出错。错误还得看具体的代码,以上列出的只是我碰到的一些问题。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狂狂狂狂狂哉。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值