// disconnect from camera service // It's okay to call this when the native camera context is already null. // This handles the case where the user has called release() and the // finalizer is invoked later. static void android_hardware_Camera_release(JNIEnv *env, jobject thiz) { // TODO: Change to LOGV LOGV("release camera"); JNICameraContext* context = NULL; sp<Camera> camera; { Mutex::Autolock _l(sLock); context = reinterpret_cast<JNICameraContext*>(env->GetIntField(thiz, fields.context)); // Make sure we do not attempt to callback on a deleted Java object. env->SetIntField(thiz, fields.context, 0); } // clean up if release has not been called before if (context != NULL) { camera = context->getCamera(); context->release(); LOGV("native_release: context=%p camera=%p", context, camera.get()); // clear callbacks if (camera != NULL) { camera->setPreviewCallbackFlags(CAMERA_FRAME_CALLBACK_FLAG_NOOP); camera->disconnect(); } // remove context to prevent further Java access context->decStrong(thiz); } }
// disconnect from camera service // It's okay to call this when the native camera context is already null. // This handles the case where the user has called release() and the // finalizer is invoked later. static void android_hardware_Camera_release(JNIEnv *env, jobject thiz) { // TODO: Change to ALOGV ALOGV("release camera"); JNICameraContext* context = NULL; sp<Camera> camera; { Mutex::Autolock _l(sLock); context = reinterpret_cast<JNICameraContext*>(env->GetIntField(thiz, fields.context)); // Make sure we do not attempt to callback on a deleted Java object. env->SetIntField(thiz, fields.context, 0); } // clean up if release has not been called before if (context != NULL) { camera = context->getCamera(); context->release(); ALOGV("native_release: context=%p camera=%p", context, camera.get()); //!++ //#ifdef MTK_CAMERA_BSP_SUPPORT #if 1 ALOGD("(tid:%d)[native_release] + context=%p camera=%p \n", ::gettid(), context, camera.get()); // clear callbacks if (camera != NULL) { ALOGD("[native_release] context->getStrongCount(%d) camera->getStrongCount(%d) \n", context->getStrongCount(), camera->getStrongCount()); camera->setPreviewCallbackFlags(CAMERA_FRAME_CALLBACK_FLAG_NOOP); camera->disconnect(); camera = NULL; } ALOGD("(tid:%d)[native_release] - context=%p camera=%p \n", ::gettid(), context, camera.get()); #else // clear callbacks if (camera != NULL) { camera->setPreviewCallbackFlags(CAMERA_FRAME_CALLBACK_FLAG_NOOP); camera->disconnect(); } #endif //MTK_CAMERA_BSP_SUPPORT //!-- // remove context to prevent further Java access context->decStrong((void*)android_hardware_Camera_native_setup); } //!++ //#ifdef MTK_CAMERA_BSP_SUPPORT ALOGD("(tid:%d)[release camera] - X context=%p \n", ::gettid(), context); //#endif //!-- }
sp<Camera> get_native_camera(JNIEnv *env, jobject thiz, JNICameraContext** pContext) { sp<Camera> camera; Mutex::Autolock _l(sLock); JNICameraContext* context = reinterpret_cast<JNICameraContext*>(env->GetIntField(thiz, fields.context)); if (context != NULL) { camera = context->getCamera(); } LOGV("get_native_camera: context=%p, camera=%p", context, camera.get()); if (camera == 0) { jniThrowRuntimeException(env, "Method called after release()"); } if (pContext != NULL) *pContext = context; return camera; }