Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0da716be authored by Jiawen Chen's avatar Jiawen Chen
Browse files

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
parent 9d730330
Loading
Loading
Loading
Loading
+13 −6
Original line number Original line Diff line number Diff line
@@ -50,24 +50,31 @@ bool InitJni(JNIEnv* env) {
        if (cameraMetadataClazz == nullptr) {
        if (cameraMetadataClazz == nullptr) {
            return false;
            return false;
        }
        }
        android_hardware_camera2_CameraMetadata_getNativeMetadataPtr =
        const jmethodID cameraMetadata_getNativeMetadataPtr =
            env->GetMethodID(cameraMetadataClazz, "getNativeMetadataPtr", "()J");
            env->GetMethodID(cameraMetadataClazz, "getNativeMetadataPtr", "()J");
        if (android_hardware_camera2_CameraMetadata_getNativeMetadataPtr == nullptr) {
        if (cameraMetadata_getNativeMetadataPtr == nullptr) {
            return false;
            return false;
        }
        }


        android_hardware_camera2_CameraCharacteristics_clazz = env->FindClass(
        const jclass cameraCharacteristics_clazz = env->FindClass(
            android_hardware_camera2_CameraCharacteristics_jniClassName);
            android_hardware_camera2_CameraCharacteristics_jniClassName);
        if (android_hardware_camera2_CameraCharacteristics_clazz == nullptr) {
        if (cameraCharacteristics_clazz == nullptr) {
            return false;
            return false;
        }
        }


        android_hardware_camera2_CaptureResult_clazz = env->FindClass(
        const jclass captureResult_clazz = env->FindClass(
            android_hardware_camera2_CaptureResult_jniClassName);
            android_hardware_camera2_CaptureResult_jniClassName);
        if (android_hardware_camera2_CaptureResult_clazz == nullptr) {
        if (captureResult_clazz == nullptr) {
            return false;
            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 true;
    }();
    }();
    return ok;
    return ok;