解决jna调用动态库失败问题

  • 背景
    项目是springboot项目。其中,涉及加密功能由客户端C++配合硬件加密狗完成。后台服务通过jna调用C++提供的动态库,完成授权加密过程。动态库位于项目根目录下,maven打包后和jar包平级(同目录下)。
    在这里插入图片描述

  • 现象
    实测中,Windows环境下(动态库格式xx.dll),无论是本地运行还是打成jar包后运行,都能正常调用。但移到linux系统中后(动态库格式xx.so),就会报动态库找不到错误。项目终归是要部署在服务器上,故下文只介绍在linux系统中解决过程。报错截图如下

linux下项目目录
在这里插入图片描述
运行后报错内容
在这里插入图片描述
在这里插入图片描述

  • 解决过程

1.原理
在着手解决前,要想理清jvm加载动态库的过程,这样才能更快的找到问题点。jvm在载入动态库时候,会从java.library.path所指定的目录下开始查找,找不到就会报动态库缺少的错误。此外,如果动态库a.so依赖于b.so,则jvm在加载a.so之前,会先加载b.so。也就是说,如果a.so和b.so不在一个目录下,即使在加载a.so时,指定了目录,也会报动态库缺少错误。如下:

Native.loadLibrary( “/home/test/liba.so”, Test.class)

2.配置
结合上面说的过程和自己的目录结构,对比可知,项目用到的动态库及其依赖,均在一个目录下,没有问题。但没有指定jvm加载动态库时的路径。故先配置一下动态库加载路径。

mkdir lib
mv *.so lib
vim /etc/profile
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/zjun/wisdom/lib
source /etc/profile

配置后的目录结构
在这里插入图片描述
配置文件/etc/profile内容
在这里插入图片描述
3.重启
在配置完路径后,重新启动服务,发现还是报动态库缺少错误,和最开始的报错截图一模一样。又回到的起点,还要继续排查。

4.安装依赖
在动态库路径一致,且配置动态库加载路径情况下还报错,再结合上面说的加载原理。突然想到,也有可能是调用的动态库还依赖于其他动态库或系统库,只是不知道而已。于是直接用ldd查看相关依赖。

查看依赖在这里插入图片描述
结果显示,调用的动态库确实缺少三个。依次安装CXXABI_1.3.9、GLIBCXX_3.4.21和libcryptopp.so.8。其中前两个是系统库,直接安装即可(略),最后一个是libcryptopp.so.8.2.0的引用(查看客户端源码的编译后才知道),直接建立软连接即可。

ln -s libcryptopp.so.8.2.0 libcryptopp.so.8

这是依赖都安装完后的
在这里插入图片描述
5.重启
经过上面步骤后,再次重启服务,再无报错,问题得以解决。

6.参考文章
1.https://www.cnblogs.com/tenny-peng/p/14113286.html
2.https://www.cnblogs.com/interdrp/p/5012185.html
3.https://www.jianshu.com/p/df8e82ade760
4.https://blog.csdn.net/yang8532704/article/details/107993137

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值