From 0da716bedb8d61afdb46d1871e3eea5c580c8fa2 Mon Sep 17 00:00:00 2001 From: Jiawen Chen Date: Tue, 28 Jan 2020 15:31:08 -0500 Subject: [PATCH] Fix ACameraMetadata_fromCameraMetadata crash. Root cause was that jclass instances acquired from JNIEnv::FindClass are not pinned and become invalidated due to Java garbage collection. Adding a new global ref pins the pointer. FIXED=148174094 Test: atest android.hardware.camera2.cts.CameraManagerTest#testCameraCharacteristicsNdkFromSdk android.hardware.camera2.cts.CaptureResultTest#testCameraCaptureResultAllKeys Test: atest NativeCameraDeviceTest NativeCameraManagerTest NativeImageReaderTest NativeStillCaptureTest Change-Id: Id0601b9c01e1a58485e3b039a87a5cf56a19e0af --- camera/ndk/NdkCameraMetadata.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/camera/ndk/NdkCameraMetadata.cpp b/camera/ndk/NdkCameraMetadata.cpp index 99691ed613..1fec3e13d9 100644 --- a/camera/ndk/NdkCameraMetadata.cpp +++ b/camera/ndk/NdkCameraMetadata.cpp @@ -50,24 +50,31 @@ bool InitJni(JNIEnv* env) { if (cameraMetadataClazz == nullptr) { return false; } - android_hardware_camera2_CameraMetadata_getNativeMetadataPtr = + const jmethodID cameraMetadata_getNativeMetadataPtr = env->GetMethodID(cameraMetadataClazz, "getNativeMetadataPtr", "()J"); - if (android_hardware_camera2_CameraMetadata_getNativeMetadataPtr == nullptr) { + if (cameraMetadata_getNativeMetadataPtr == nullptr) { return false; } - android_hardware_camera2_CameraCharacteristics_clazz = env->FindClass( + const jclass cameraCharacteristics_clazz = env->FindClass( android_hardware_camera2_CameraCharacteristics_jniClassName); - if (android_hardware_camera2_CameraCharacteristics_clazz == nullptr) { + if (cameraCharacteristics_clazz == nullptr) { return false; } - android_hardware_camera2_CaptureResult_clazz = env->FindClass( + const jclass captureResult_clazz = env->FindClass( android_hardware_camera2_CaptureResult_jniClassName); - if (android_hardware_camera2_CaptureResult_clazz == nullptr) { + if (captureResult_clazz == nullptr) { return false; } + android_hardware_camera2_CameraMetadata_getNativeMetadataPtr = + cameraMetadata_getNativeMetadataPtr; + android_hardware_camera2_CameraCharacteristics_clazz = + static_cast(env->NewGlobalRef(cameraCharacteristics_clazz)); + android_hardware_camera2_CaptureResult_clazz = + static_cast(env->NewGlobalRef(captureResult_clazz)); + return true; }(); return ok;