最全Android UVC Camera 闪退问题修复

这应该是最简洁的Android UVC Camera库了

一、快速点击拍照按钮闪退

修改UVCButtonCallback.cpp文件里的uvc_button_callback方法
在这里插入图片描述
修改前:

void UVCButtonCallback::uvc_button_callback(int button, int state, void *user_ptr) {

	UVCButtonCallback *buttonCallback = reinterpret_cast<UVCButtonCallback *>(user_ptr);

	JavaVM *vm = getVM();
	JNIEnv *env;
	// attach to JavaVM
	vm->AttachCurrentThread(&env, NULL);

	buttonCallback->notifyButtonCallback(env, button, state);
	
	vm->DetachCurrentThread();
}

修改后:

void UVCButtonCallback::uvc_button_callback(int button, int state, void *user_ptr) {
	UVCButtonCallback *buttonCallback = reinterpret_cast<UVCButtonCallback *>(user_ptr);
	JavaVM *vm = getVM();
	JNIEnv *env;
	bool isAttached = false;

	int status = vm->GetEnv((void**)&env, JNI_VERSION_1_6);
	if (status < 0) {
	    // attach to JavaVM
	    if (vm->AttachCurrentThread(&env, NULL)) {
	        return;
	    }
	    isAttached = true;
	}

	buttonCallback->notifyButtonCallback(env, button, state);

    if (isAttached) {
        vm->DetachCurrentThread();
    }
}

二、拔出设备闪退

2.1 修改android_usbfs.c和linux_usbfs.c文件里的handle_iso_completion方法

在这里插入图片描述
增加判空逻辑:

    if (tpriv->iso_urbs == NULL) {
        break;
    }

2.2 修改stream.c文件里的_uvc_delete_transfer方法

在这里插入图片描述
注释掉:

    //libusb_free_transfer(transfer);

三、预览偶现闪退

3.1 修改UVCPreview.h文件

在这里插入图片描述

    volatile bool mHasCaptureThread;

3.2 修改UVCPreview.cpp文件

**do_preview: **
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-84eRjOxJ-1626853558060)(/api/project/7839781/files/24517234/imagePreview)]

    mHasCaptureThread = false;
    if (LIKELY(!result)) {
        clearPreviewFrame();
        if (pthread_create(&capture_thread, NULL, capture_thread_func, (void *)this) == 0) {
            mHasCaptureThread = true;
        }

do_capture_callback:
在这里插入图片描述

    if (iframecallback_fields.onFrame) {
        env->CallVoidMethod(mFrameCallbackObj, iframecallback_fields.onFrame, buf);
    }

stopPreview:
在这里插入图片描述

    if (mHasCaptureThread) {
        pthread_cond_signal(&capture_sync);
        if (pthread_join(capture_thread, NULL) != EXIT_SUCCESS) {
            LOGW("UVCPreview::terminate capture thread: pthread_join failed");
        }
    }
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值