起因:
公司买了某公司机芯,该公司技术支持给的sdk是海康的,集成进自己的项目后出现了一系列问题,现解决后为大家一一排坑。
问题一:将sdk中的jar包和abi包复制进项目后,执行HCNetSDK.getInstance()这行代码直接崩溃闪退。


问题一解决步骤:
第一步:jar包和abi包最好分开复制,不要复制到一个文件夹中(其实也可以,只是很乱)
- jar包放进app/libs路径下

- abi包放进app/src/main/jniLibs路径下(没有这个包就自建一个,有的话注意不要覆盖之前的文件)

第二步:打开build.gradle文件进行配置
- 在文件中的android配置项中添加这一坨,作用是指定abi包中的so库文件路径
ps:要结合自己的路径,我这里和上面保持一致的

- 同样是android配置项中,如果没有就添加,如果有就和上面导入的abi包目录保持一致。(比如我导入的是三个架构的包:arm64-v8a、armeabi-v7a、armeabi,那么这里就和导入的三个架构包保持一致,如果只有其中两个那就只保留两个)
第三步:在jar包上单击右键,选择add as library,就会自动在配置文件中生成依赖
ps:其实我第一行依赖就导入了libs中所有的aar包和jar包,但还是喜欢自己add一下

第四步:同步一下所有依赖
- 点这个大象就行,或者大家在工具栏的File->sync project with gradle files也可以找到

至此,sdk包导入完成,问题一解决(或者我有做错的地方,也请大佬们指出)
———————————————————————————————————————————
问题二:sdk初始化成功后,注册设备一直失败,调用NET_DVR_Login_V30后返回-1,打印错误码显示7(7对应的错误信息是设备不在线之类的反正就是连接失败)

问题二解决步骤:
第一步:检查ip和端口,我是被某厂家的技术支持坑了,所以端口设置错了,其实海康设备的sdk端口默认是8000,一般没改过。

第二步:一般人改了正确的端口应该可以了,但我还是返回-1,于是咱们开启一个sdk记录日志的功能,调用NET_DVR_SetLogToFile函数。

ps:三个参数分别是↓↓↓↓↓↓↓↓↓↓↓↓↓↓
第三步:打开咱们安卓设备上存放的日志,开始分析

- 最紧要的提示就是带DBG、ERR的。分析出来发现说无效的路径,找不到对应的库文件。
[DBG] CCoreGlobalCtrlBase::LoadDSo, HPR_LoadDSo, hHandleRet[0], path[libcrypto.so.1.1], syserror[2]
[ERR] Load BASE_DLL_LIBEAY failed[syserr: 2]
[DBG] CCoreGlobalCtrlBase::LoadDSo, HPR_LoadDSo, hHandleRet[c44ed0c5], path[libcryptoPrivate.so], syserror[2]
[DBG] CCoreGlobalCtrlBase::LoadDSo, HPR_LoadDSo, hHandleRet[50b62a63], path[libsslPrivate.so], syserror[2]
[ERR] GetCAPath, Failed, Invalid pPath
[ERR] GetCAPath, Failed, Invalid pPath
- 那么这个问题怎么产生的呢,我问技术支持,人家在群里不甩我,于是我想“既然你是海康的sdk,那我就找海康的技术支持是一样的”,于是我给海康技术支持写邮件描述问题,将日志也作为附件发送了出去,于是得到以下回复:

- 上面几条排查过后,来到了最重要的一条,版本过低!!!!! 随即醍醐灌顶,某厂家技术支持给的sdk版本太低,设备版本比较高,所以缺少需要的so库文件。并且使用人家海康的电脑版测试工具后发现最新版sdk是可以用在我的设备上的。于是立马去官网下载最新版sdk(相关资料会放结尾)。下载后重复上面导入sdk的步骤,再测试,发现注册设备没问题了,也可以控制相机变倍。
至此,问题算是完全解决了0.0
———————————————————————————————————————————
本次解决问题所使用到的相关资料:
1.sdk最新版下载地址:海康开放平台
2.sdk使用手册: 设备网络SDK编程指南(Android).pdf - 飞书云文档
(因为没看到咋上传文件,所以搞了个在线文档,其实下载的sdk中也是有的,方便大家打开就转成在线文档了)
3.我封装的sdk类:(因为我们需求只是控制相机变倍,所以封装得很简单,但其实其它功能也是调用对应的方法就可以了)
import com.blankj.utilcode.util.ToastUtils
import com.hcnetsdk.jna.HCNetSDKByJNA.NET_DVR_DEVICEINFO_V40
import com.hikvision.netsdk.HCNetSDK
import com.hikvision.netsdk.NET_DVR_ACTIVATECFG
import com.hikvision.netsdk.NET_DVR_DEVICEINFO_V30
class CameraManager {
/**
* 作用:调用sdk中的函数的集合
*/
var sdk:HCNetSDK = HCNetSDK.getInstance()
var ip:String = "自己设备的ip"
var port:Int = 8000
var userName:String = "admin"
var password:String = "激活设备设置的密码"
var userIdLocal:Int = -1
val deviceInfo30 = NET_DVR_DEVICEINFO_V30()
//初始化sdk
init{
// 初始化SDK
if (!sdk.NET_DVR_Init()) {
ToastUtils.showShort("相机初始化失败")
throw RuntimeException("SDK初始化失败")
}else{
//初始化成功
//设置超时时间
sdk.NET_DVR_SetConnectTime(5000)
//开启写日志功能
sdk.NET_DVR_SetLogToFile(3, "/sdcard/gfsdklog/", true)
userIdLocal = login(ip,port,userName,password)
}
}
//注册设备
fun login(deviceIp: String, devicePort: Int, userName: String, password: String): Int {
try{
val userId = sdk.NET_DVR_Login_V30(deviceIp, devicePort, userName, password, deviceInfo30)
if (userId < 0) {
var errorcode = sdk.NET_DVR_GetLastError()
ToastUtils.showShort("相机登录失败,错误码:$errorcode")
return -1
}else{
return userId
}
}catch (e:Exception){
ToastUtils.showShort("相机登录失败")
return -1
}
}
//云台控制操作
fun control(userId:Int,channel:Int,command:Int,stop:Int){
if(userIdLocal != -1){
//可以开始控制云台
var flag = sdk.NET_DVR_PTZControl_Other(userId, channel, command, stop)
if(flag){
//控制成功
}else{
//控制失败
val errorCode = sdk.NET_DVR_GetLastError()
ToastUtils.showShort("云台控制失败,错误码:$errorCode")
}
}
else{
var errorcode = sdk.NET_DVR_GetLastError()
ToastUtils.showShort("相机登录失败,错误码:$errorcode")
}
}
//释放sdk资源
fun release() {
if(userIdLocal!=-1){
sdk.NET_DVR_Logout_V30(userIdLocal)
}
sdk.NET_DVR_Cleanup()
}
}
2万+

被折叠的 条评论
为什么被折叠?



