首先遇到的jna.jar和examples.jar無法加載的問題噪舀,嘗試了很多方法無效魁淳,以下方法實(shí)測有效
其次是動態(tài)鏈接庫無法加載的問題,而且是播放庫与倡,我的方法比較簡單界逛,netsdk加載出來就行了,播放庫用不到蒸走,刪掉引用就行了
最后仇奶,我嘗試了不少于五種方式,只能說以下方式對我的項(xiàng)目有效比驻,其他方式也對他們的項(xiàng)目有效
以下是對我有效的方式
- 打開命令行该溯,將第三方j(luò)ar包安裝在本地maven倉庫(注意修改Dfile,DgroupId别惦,DartifactId狈茉,Dversion)
mvn install:install-file -Dfile=E:\IdeaProjects\uav-platform\lib\jna.jar -DgroupId=com.sun.jna -DartifactId=jna -Dversion=1.0 -Dpackaging=jar
mvn install:install-file -Dfile=E:\IdeaProjects\uav-platform\lib\examples.jar -DgroupId=com.sun.jna -DartifactId=examples -Dversion=1.0 -Dpackaging=jar
- 在工程pom文件引入即可
<dependency>
<groupId>com.sun.jna</groupId>
<artifactId>jna</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.sun.jna</groupId>
<artifactId>examples</artifactId>
<version>1.0</version>
</dependency>
- 動態(tài)庫加載說明
【庫文件加載說明】
1. lib文件夾里面所有庫文件libhcnetsdk.so、libHCCore.so掸掸、libssl.so.1.1氯庆、libcrypto.so.1.1以及HCNetSDKCom文件夾都需要加載到工程中。
2. HCNetSDKCom文件夾如果和libhcnetsdk.so扰付、libhpr.so堤撵、libHCCore文件、可執(zhí)行文件不在同級目錄羽莺,或者加載失敗实昨,可以調(diào)用NET_DVR_SetSDKInitCfg(enumType類型賦值為2,lpInBuff對應(yīng)結(jié)構(gòu)體NET_DVR_LOCAL_SDK_PATH)設(shè)置組件庫所在路徑盐固。
3. libcrypto.so.1.1和libssl.so.1.1是開源庫荒给,如果庫文件加載失敗,可以調(diào)用NET_DVR_SetSDKInitCfg(enumType類型賦值為3刁卜,lpInBuff對應(yīng)libcrypto.so.1.1所在的路徑字符串)志电、NET_DVR_SetSDKInitCfg(enumType類型賦值為4,lpInBuff對應(yīng)libssl.so.1.1所在的路徑字符串)指定下這些庫文件加載路徑蛔趴。
4. 如果庫文件加載始終不成功挑辆,初始化失敗,可以嘗試將SDK所在路徑添加到LD_LIBRARY_PATH環(huán)境變量中。
【路徑設(shè)置的Java示例代碼】
//這里是庫的絕對路徑鱼蝉,請根據(jù)實(shí)際情況修改茉继,注意改路徑必須有訪問權(quán)限
//設(shè)置HCNetSDKCom組件庫所在路徑
String strPathCom = "/home/test/Desktop/JavaDemoLinux/lib";
HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH();
System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length());
struComPath.write();
hCNetSDK.NET_DVR_SetSDKInitCfg(2, struComPath.getPointer());
//設(shè)置libcrypto.so所在路徑
HCNetSDK.BYTE_ARRAY ptrByteArrayCrypto = new HCNetSDK.BYTE_ARRAY(256);
String strPathCrypto = "/home/test/Desktop/JavaDemoLinux/lib/libcrypto.so.1.1";
System.arraycopy(strPathCrypto.getBytes(), 0, ptrByteArrayCrypto.byValue, 0, strPathCrypto.length());
ptrByteArrayCrypto.write();
hCNetSDK.NET_DVR_SetSDKInitCfg(3, ptrByteArrayCrypto.getPointer());
//設(shè)置libssl.so所在路徑
HCNetSDK.BYTE_ARRAY ptrByteArraySsl = new HCNetSDK.BYTE_ARRAY(256);
String strPathSsl = "/home/test/Desktop/JavaDemoLinux/lib/libssl.so.1.1";
System.arraycopy(strPathSsl.getBytes(), 0, ptrByteArraySsl.byValue, 0, strPathSsl.length());
ptrByteArraySsl.write();
hCNetSDK.NET_DVR_SetSDKInitCfg(4, ptrByteArraySsl.getPointer());
【路徑設(shè)置的C++示例代碼】
char cryptoPath[2048] = {0};
sprintf(cryptoPath, "/home/test/Desktop/alarm_demo/libcrypto.so.1.1");
NET_DVR_SetSDKInitCfg(NET_SDK_INIT_CFG_LIBEAY_PATH, cryptoPath);
char sslPath[2048] = {0};
sprintf(sslPath, "/home/test/Desktop/alarm_demo/libssl.so.1.1");
NET_DVR_SetSDKInitCfg(NET_SDK_INIT_CFG_SSLEAY_PATH, sslPath);
NET_DVR_LOCAL_SDK_PATH struComPath = {0};
sprintf(struComPath.sPath, "/home/test/Desktop/alarm_demo"); //HCNetSDKCom文件夾所在的路徑
NET_DVR_SetSDKInitCfg(NET_SDK_INIT_CFG_SDK_PATH, &struComPath);
參考:
- https://open.hikvision.com/download/5cda567cf47ae80dd41a54b3?type=10
- https://blog.csdn.net/shiwenjun18/article/details/130205302
- 一些嘗試過的其他方式
<!-- 加地址 -->
<dependency>
<groupId>com.sun.jna</groupId>
<artifactId>jna</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/jna.jar</systemPath>
</dependency>
<!-- 外部地址 -->
<dependency>
<groupId>com.sun.jna</groupId>
<artifactId>jna</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/../lib/jna.jar</systemPath>
</dependency>
<!-- 項(xiàng)目提示無法加載外部依賴 -->
<dependency>
<groupId>com.sun.jna</groupId>
<artifactId>jna</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${pom.basedir}/../lib/jna.jar</systemPath>
</dependency>
<!-- 在以上方式的基礎(chǔ)上添加配置 -->
<configuration>
<includeTypes>jar</includeTypes>
<includeScope>system</includeScope>
</configuration>