海康摄像头视频调用出错,Jni Error(app bug): accessed stale local reference解决办法

项目中要在Android手机中调用海康摄像头拍摄的画面,在公司网管配置好了网络地址(不要与其他局域网内地址冲突)和端口,并激活摄像头设备后,通过SADPTool(海康提供的摄像头搜索工具)可以自动检索到当前局域网内已激活的设备,通过设备列表中双击设备所在IP(即网管之前配置的IP),输入默认的用户名和密码(admin、111)进入设备管理界面,即可在PC端(浏览器中)看到摄像头拍摄的画面。至此,准备工作已完成,可以开始在APP中接入SDK。

 

笔者在网上找了一个集成了SDK的APP demo 源码,运行后正确设置了配置信息,也可以在手机上看到。该demo在以下资源3中可下载,主要给读者对比是否是读者正在使用的出错的demo。

 

资源下载地址:

1、SADPTool:(0积分)

http://download.csdn.net/detail/daijin888888/9258643

2、截止此博文发表前最新SDK包: (0积分,也可在官网的开发平台萤石开放平台下载最新包,需要注册开发者账号:https://open.ys7.com/sdk.html)

http://download.csdn.net/detail/daijin888888/9258673

3、网上找的集成过SDK的APP demo:(0积分,独立运行正常,但移植后报错)

http://download.csdn.net/detail/daijin888888/9258665

4、经过笔者更新SDK后的APP:(0积分,可直接下载使用,在3的基础上修改)

http://download.csdn.net/detail/daijin888888/9258633

GitHub(给个星杯~):https://github.com/VingeDai/HIKVISIONMonitor

3中的demo可以正常运行,但是移植到我的项目中就会报错,如下:

经多次尝试测试,发现是SDK版本问题

解决办法:更换新的SDK。将以上资源3中的HCNetSDK.jar和PlayerSDK.jar移除,并导入以上资源2中的ezviz-openapi-android-sdk.jar和armeabi中的所有.so文件,此时会有一个方法报错:

 

//抓图回调函数
PlayerDisplayCB displayCB = new PlayerDisplayCB() {
       @Override
     public void onDisplay(int arg0, ByteBuffer arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7) {
            if (null != context) {
                   context.sendBroadcast(new Intent(ACTION_START_RENDERING));
            } else {
                    Log.e(TAG, "Context为空!没有setContext(Context context)?");
            }
                    Log.d(TAG, "开始画面渲染");
            if (Player.getInstance().setDisplayCB(m_iPort, null)) {
                   Log.i(TAG, "移除显示回调成功!");
          } else {
                    Log.e(TAG, "移除显示回调失败!");
            }
          }
};

 因为这个回调函数在新版本中被改写了,开发者只需重写新的onDisplay方法,并将旧的onDisplay方法体中的内容移动到新方法中,删掉旧onDisplay方法即可。

 

更改后:

 

//抓图回调函数
PlayerDisplayCB displayCB = new PlayerDisplayCB() {
	@Override
	public void onDisplay(int arg0, byte[] arg1,
			int arg2, int arg3, int arg4, int arg5,
				int arg6, int arg7) {
		if (null != context) {
                       context.sendBroadcast(new Intent(ACTION_START_RENDERING));
                    } else {
                       Log.e(TAG, "Context为空!没有setContext(Context context)?");
                     }
                       Log.d(TAG, "开始画面渲染");
                     if (Player.getInstance().setDisplayCB(m_iPort, null)) {
                       Log.i(TAG, "移除显示回调成功!");
                     } else {
                       Log.e(TAG, "移除显示回调失败!");
                     }					
		}
};

重新运行项目,即可成功获取画面。

 

 

修改后的demo见以上下载资源4。

 

请尊重原创,转载请注明出处:

http://blog.csdn.net/daijin888888/article/details/49763161

 

 

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值