# 项目场景:springboot项目调用xxx.so文件常见问题
前言
本章节主要介绍:java项目需要使用System.loadLibrary(“xxx”)来调用.so的类库,在集成过程中国遇到的问题以及问题的处理。
一、loadLibrary()是什么?
loadLibrary()方法用于使用名为library_name(library name)的给定参数作为在该方法中传递的参数来加载库,一个Java文件包含我们需要使用loadLibrary()方法加载该库的本机代码。在此方法中,以特定于系统的方式完成了从library_name到给定文件名的映射。在类加载和实例化时,也将加载本机方法所需的已实现本机代码
二、加载.so文件实例
1.代码载入
首先要有一个libidg_java.so的文件,
package com.oak 这里的路径是根据.so文件固定的,文件准备好后,会更具包路径以及路径名称取找对应的实现,所以路径不能变更
idg 类里面的方法对应的就是.so里面的实现,根据业务自行实现
package com.oak;
public class idg {
static {
System.loadLibrary("idg_java");
}
public native long init(byte[] name, int major, int minor, int build, byte[] authcode, byte[] conf_base_path, byte[] log_base_path);
public native long fini();
public native long getlicence();
public native long donglecheck();
public long jinit(String name, int major, int minor, int build, String authcode, String conf_base_path, String log_base_path)
{
return init(name.getBytes(), major, minor, build, authcode.getBytes(), conf_base_path.getBytes(), log_base_path.getBytes());
}
public long jfini()
{
return fini();
}
public long jget_licence()
{
return getlicence();
}
public long jdongle_check()
{
return donglecheck();
}
}
2.调用方式
更具实际业务处理
obj = new idg();
long ret = this.obj.jinit("xxx", 3, 0, 0, "", "", "");
if (ret == 0) {
log.info("初始化成功!");
} else {
log.error("初始化失败");
}
三、常见问题
1.在库加载时,loadLibrary()方法可能会引发异常
SecurityException:在此异常中,checkLink()当安全管理器存在时,其方法不允许加载在方法中传递的指定库
UnsatisfiedLinkError:在这种情况下,如果加载的库不存在。
NullPointerException:在此异常中,如果加载的库为null。
2.异常处理
SecurityException:这个去掉安全管理即可
UnsatisfiedLinkError:这个需要配置共享lib库
解决方案
配置.so文件 让java服务能够load到
1、配置环境变量。 尝试不好使
export LD_LIBRARY_PATH=/root/oak/lib/:$LD_LIBRARY_PATH
2、配置共享库 偶尔成功
cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
echo "/root/baller/lib" >> /etc/ld.so.conf
ldconfig 刷新的作用
3、java启动添加参数 目前成功100%
nohup java -Djava.library.path=/root/oak/lib/ -jar $APP_NAME > $PRGDIR/log/start.log 2>&1 &
NullPointerException:在此异常中,如果加载的库为null。
解决方案
1、确定好java的加载类路径正确, 确保初始化代码正确
总结
总而验证,遇到的几个问题就是.so文件资源找不到,还有就是.so资源里面定义的接口方法,和java实现类定义的有出入。导致的问题,遇到问题从这两方面入手基本可以解决。