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
diff --git a/camera/ndk/NdkCameraMetadata.cpp b/camera/ndk/NdkCameraMetadata.cpp
index 99691ed..1fec3e1 100644
--- a/camera/ndk/NdkCameraMetadata.cpp
+++ b/camera/ndk/NdkCameraMetadata.cpp
@@ -50,24 +50,31 @@
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<jclass>(env->NewGlobalRef(cameraCharacteristics_clazz));
+ android_hardware_camera2_CaptureResult_clazz =
+ static_cast<jclass>(env->NewGlobalRef(captureResult_clazz));
+
return true;
}();
return ok;