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
gugelfrei
Jiawen Chen 4 years ago
parent 9d73033022
commit 0da716bedb

@ -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<jclass>(env->NewGlobalRef(cameraCharacteristics_clazz));
android_hardware_camera2_CaptureResult_clazz =
static_cast<jclass>(env->NewGlobalRef(captureResult_clazz));
return true;
}();
return ok;

Loading…
Cancel
Save