一、快速点击拍照按钮闪退
修改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: **
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");
}
}