在使用libuvccamera库的UVCCamera时,经常在调用stopPreview关闭预览的时候,app直接崩溃闪退了,经过综合各种修改源码的方案,已解决这个问题,以下请参考:

  1. 首先找到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;
	}
}
  1. 找到UVCPreview.h文件,在volatile bool mIsCapturing;这一行下添加一行,如下:
	volatile bool mIsCapturing;
    volatile bool mHasCaptureThread;
  1. 找到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);
}

至此,修改完毕,重新编译运行吧!希望能够帮到你~

Logo

更多推荐