天天看点

海康摄像头视频调用出错,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可以正常运行,但是移植到我的项目中就会报错,如下:

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

经多次尝试测试,发现是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, "移除显示回调失败!");
                     }					
		}
};
           

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

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

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

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

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