static void android_hardware_Camera_setHasPreviewCallback(JNIEnv *env, jobject thiz, jboolean installed, jboolean manualBuffer) { LOGV("setHasPreviewCallback: installed:%d, manualBuffer:%d", (int)installed, (int)manualBuffer); // Important: Only install preview_callback if the Java code has called // setPreviewCallback() with a non-null value, otherwise we'd pay to memcpy // each preview frame for nothing. JNICameraContext* context; sp<Camera> camera = get_native_camera(env, thiz, &context); if (camera == 0) return; // setCallbackMode will take care of setting the context flags and calling // camera->setPreviewCallbackFlags within a mutex for us. context->setCallbackMode(env, installed, manualBuffer); }
static void android_hardware_Camera_setPreviewCallbackSurface(JNIEnv *env, jobject thiz, jobject jSurface) { ALOGV("setPreviewCallbackSurface"); JNICameraContext* context; sp<Camera> camera = get_native_camera(env, thiz, &context); if (camera == 0) return; sp<IGraphicBufferProducer> gbp; sp<Surface> surface; if (jSurface) { surface = android_view_Surface_getSurface(env, jSurface); if (surface != NULL) { gbp = surface->getIGraphicBufferProducer(); } } // Clear out normal preview callbacks context->setCallbackMode(env, false, false); // Then set up callback surface if (camera->setPreviewCallbackTarget(gbp) != NO_ERROR) { jniThrowException(env, "java/io/IOException", "setPreviewCallbackTarget failed"); } }