Camera NDK: New lifecycle for ACameraMetadata_fromCameraMetadata
Instead of requiring the user to call NewGlobalRef/DeleteGlobalRef
for keeping the java object alive when creating an NDK view into it,
reference count the real native data instead, so that there's no need
to keep track of the Java object lifecycle.
- Switch CameraMetadataNative to use std::shared_ptr internally
- Switch ACameraMetadata to use std::shared_ptr internally
- Always copy data in the ACameraMetadata copy constructor
Test: New CTS tests pass, fail without this CL
Bug: 148972471
Change-Id: I40a0ccb8b40c7a89ee7d3a6f7bac7c9c88d709f1
diff --git a/camera/ndk/NdkCameraMetadata.cpp b/camera/ndk/NdkCameraMetadata.cpp
index 1fec3e1..7d3a53e 100644
--- a/camera/ndk/NdkCameraMetadata.cpp
+++ b/camera/ndk/NdkCameraMetadata.cpp
@@ -81,15 +81,16 @@
}
// Given cameraMetadata, an instance of android.hardware.camera2.CameraMetadata, invokes
-// cameraMetadata.getNativeMetadataPtr() and returns it as a CameraMetadata*.
-CameraMetadata* CameraMetadata_getNativeMetadataPtr(JNIEnv* env, jobject cameraMetadata) {
+// cameraMetadata.getNativeMetadataPtr() and returns it as a std::shared_ptr<CameraMetadata>*.
+std::shared_ptr<CameraMetadata>* CameraMetadata_getNativeMetadataPtr(JNIEnv* env,
+ jobject cameraMetadata) {
if (cameraMetadata == nullptr) {
ALOGE("%s: Invalid Java CameraMetadata object.", __FUNCTION__);
return nullptr;
}
jlong ret = env->CallLongMethod(cameraMetadata,
android_hardware_camera2_CameraMetadata_getNativeMetadataPtr);
- return reinterpret_cast<CameraMetadata *>(ret);
+ return reinterpret_cast<std::shared_ptr<CameraMetadata>* >(ret);
}
} // namespace
@@ -179,10 +180,9 @@
return nullptr;
}
- CameraMetadata* src = CameraMetadata_getNativeMetadataPtr(env,
- cameraMetadata);
- ACameraMetadata* output = new ACameraMetadata(src, type);
+ auto sharedData = CameraMetadata_getNativeMetadataPtr(env, cameraMetadata);
+ ACameraMetadata* output = new ACameraMetadata(*sharedData, type);
output->incStrong(/*id=*/(void*) ACameraMetadata_fromCameraMetadata);
return output;
}
-#endif /* __ANDROID_VNDK__ */
\ No newline at end of file
+#endif /* __ANDROID_VNDK__ */