解决Android UVCCamera stopPreview 报错 崩溃 闪退 问题
在使用libuvccamera库的UVCCamera时,经常在调用stopPreview关闭预览的时候,app直接崩溃闪退了,经过综合各种修改源码的方案,已解决这个问题,以下请参考:首先找到android_usbfs.c,linux_usbfs.c两个原文件,在两个文件中都可以找到这段代码,按如下示例修改:修改前:for (i = 0; i < num_urbs; i++) {if (urb
·
在使用libuvccamera库的UVCCamera时,经常在调用stopPreview关闭预览的时候,app直接崩溃闪退了,经过综合各种修改源码的方案,已解决这个问题,以下请参考:
- 首先找到android_usbfs.c,linux_usbfs.c两个文件,在两个文件中都可以找到这段代码,按如下示例修改:
修改前:
for (i = 0; i < num_urbs; i++) {
if (urb == tpriv->iso_urbs[i]) {
urb_idx = i + 1;
break;
}
}
修改后:
for (i = 0; i < num_urbs; i++) {
if (tpriv->iso_urbs == NULL){
break;
}
if (urb == tpriv->iso_urbs[i]) {
urb_idx = i + 1;
break;
}
}
- 找到UVCPreview.h文件,在volatile bool mIsCapturing;这一行下添加一行,如下:
volatile bool mIsCapturing;
volatile bool mHasCaptureThread;
- 找到UVCPreview.cpp文件,按如下修改:
修改前:
pthread_cond_signal(&preview_sync);
pthread_cond_signal(&capture_sync);
if (pthread_join(capture_thread, NULL) != EXIT_SUCCESS) {
LOGW("UVCPreview::terminate capture thread: pthread_join failed");
}
修改后:
pthread_cond_signal(&preview_sync);
if (mHasCaptureThread) {
pthread_cond_signal(&capture_sync);
if (pthread_join(capture_thread, NULL) != EXIT_SUCCESS) {
LOGW("UVCPreview::terminate capture thread: pthread_join failed");
}
}
然后同个文件中再找到do_preview函数,按如下修改:
修改前:
void UVCPreview::do_preview(uvc_stream_ctrl_t *ctrl) {
...
if (LIKELY(!result)) {
clearPreviewFrame();
pthread_create(&capture_thread, NULL, capture_thread_func, (void *)this);
修改后:
void UVCPreview::do_preview(uvc_stream_ctrl_t *ctrl) {
...
mHasCaptureThread = false;
if (LIKELY(!result)) {
clearPreviewFrame();
if (pthread_create(&capture_thread, NULL, capture_thread_func, (void *)this) == 0) {
mHasCaptureThread = true;
}
最后,找到do_capture_callback函数,按如下修改就完成了:
修改前:
env->CallVoidMethod(mFrameCallbackObj, iframecallback_fields.onFrame, buf);
修改后:
if (iframecallback_fields.onFrame) {
env->CallVoidMethod(mFrameCallbackObj, iframecallback_fields.onFrame, buf);
}
至此,修改完毕,重新编译运行吧!希望能够帮到你~
更多推荐
已为社区贡献1条内容
所有评论(0)