一、错误
由于项目需要,需要对大华设备进行调试。在本地环境调试成功后发布到centos7服务器,但是运行jar包时报xxx.so找不到。
大华sdk代码的逻辑大致如下:
1、在指定目录根据系统类型找到需要加载的lib库
2、将lib库拷贝到/tmp目录下
3、加载/tmp目录下的lib库
二、解决方法
1、将lib库放入/home/libs/linux64中
libavnetsdk.so
libdhconfigsdk.so
libdhnetsdk.so
libjninetsdk.so
libStreaConvertor.so
2、在LibraryLoad类的extractLibrary方法中添加lib所在绝对路径,比如将lib放入/home/libs/linux64文件夹中。
private static String extractLibrary(String libName) {
String strPathCom = System.getProperty("user.dir") + "/libs/";
if (OsSelect.isLinux()){
strPathCom = "/home/libs/";//注意linux64不需要写,代码中会根据系统类型添加,如win64,win32,linux32等。
}
return extractLibrary(strPathCom, libName);
}
3、注意事项
(1)resources资源路径中的dynamic-lib-load.xml无需更改,不需要在前面加lib前缀。
<linux64>
<lib>avnetsdk</lib>
<lib>dhnetsdk</lib>
<lib>dhconfigsdk</lib>
<lib>StreamConvertor</lib>
<lib>jninetsdk</lib>
</linux64>
(2)SDK进行二次开发时,大多数人都是在window环境下开发,所以使用的代码可能是win下的SDK。所以发布到linux,运行报错。
Caused by: java.lang.IllegalArgumentException: Invalid calling convention 63
解决办法是将NetSDKLib类里面的fDisConnect、fHaveReConnect、fMessCallBack等所有继承StdCallCallback的类改成继承Callback就行。