diff options
3 files changed, 25 insertions, 20 deletions
diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java index 9bef2e18db08..8f3cb93ae13f 100644 --- a/core/java/android/hardware/camera2/CameraMetadata.java +++ b/core/java/android/hardware/camera2/CameraMetadata.java @@ -95,7 +95,7 @@ public abstract class CameraMetadata<TKey> { } /** - * Retrieves the native CameraMetadata* as a Java long. + * Retrieves the native std::shared_ptr<CameraMetadata*>* as a Java long. * Returns 0 if mNativeInstance is null. * * @hide diff --git a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java index aefe66fe5dec..df77f52bb034 100644 --- a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java +++ b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java @@ -1680,7 +1680,7 @@ public class CameraMetadataNative implements Parcelable { } @UnsupportedAppUsage - private long mMetadataPtr; // native CameraMetadata* + private long mMetadataPtr; // native std::shared_ptr<CameraMetadata>* private native long nativeAllocate(); private native long nativeAllocateCopy(CameraMetadataNative other) diff --git a/core/jni/android_hardware_camera2_CameraMetadata.cpp b/core/jni/android_hardware_camera2_CameraMetadata.cpp index fad5b0e9ca0f..c523e2dc6737 100644 --- a/core/jni/android_hardware_camera2_CameraMetadata.cpp +++ b/core/jni/android_hardware_camera2_CameraMetadata.cpp @@ -89,13 +89,13 @@ status_t CameraMetadata_getNativeMetadata(JNIEnv* env, jobject thiz, ALOGE("%s: Invalid output metadata object.", __FUNCTION__); return BAD_VALUE; } - CameraMetadata* nativePtr = reinterpret_cast<CameraMetadata*>(env->GetLongField(thiz, - fields.metadata_ptr)); + auto nativePtr = reinterpret_cast<std::shared_ptr<CameraMetadata> *>( + env->GetLongField(thiz, fields.metadata_ptr)); if (nativePtr == NULL) { ALOGE("%s: Invalid native pointer in java metadata object.", __FUNCTION__); return BAD_VALUE; } - *metadata = *nativePtr; + *metadata = *(nativePtr->get()); return OK; } @@ -171,12 +171,15 @@ static jint CameraMetadata_setupGlobalVendorTagDescriptor(JNIEnv *env, jobject t // Less safe access to native pointer. Does NOT throw any Java exceptions if NULL. static CameraMetadata* CameraMetadata_getPointerNoThrow(JNIEnv *env, jobject thiz) { - - if (thiz == NULL) { - return NULL; + if (thiz == nullptr) { + return nullptr; } - - return reinterpret_cast<CameraMetadata*>(env->GetLongField(thiz, fields.metadata_ptr)); + auto metadata = reinterpret_cast<std::shared_ptr<CameraMetadata> *>( + env->GetLongField(thiz, fields.metadata_ptr)); + if (metadata == nullptr) { + return nullptr; + } + return metadata->get(); } // Safe access to native pointer from object. Throws if not possible to access. @@ -205,7 +208,7 @@ static CameraMetadata* CameraMetadata_getPointerThrow(JNIEnv *env, jobject thiz, static jlong CameraMetadata_allocate(JNIEnv *env, jobject thiz) { ALOGV("%s", __FUNCTION__); - return reinterpret_cast<jlong>(new CameraMetadata()); + return reinterpret_cast<jlong>(new std::shared_ptr<CameraMetadata>(new CameraMetadata())); } static jlong CameraMetadata_allocateCopy(JNIEnv *env, jobject thiz, @@ -214,12 +217,12 @@ static jlong CameraMetadata_allocateCopy(JNIEnv *env, jobject thiz, CameraMetadata* otherMetadata = CameraMetadata_getPointerThrow(env, other, "other"); - // In case of exception, return if (otherMetadata == NULL) return NULL; - // Clone native metadata and return new pointer - return reinterpret_cast<jlong>(new CameraMetadata(*otherMetadata)); + // Clone native metadata and return new pointer. + auto clonedMetadata = new CameraMetadata(*otherMetadata); + return reinterpret_cast<jlong>(new std::shared_ptr<CameraMetadata>(clonedMetadata)); } @@ -256,14 +259,16 @@ static jint CameraMetadata_getEntryCount(JNIEnv *env, jobject thiz) { static void CameraMetadata_close(JNIEnv *env, jobject thiz) { ALOGV("%s", __FUNCTION__); - CameraMetadata* metadata = CameraMetadata_getPointerNoThrow(env, thiz); - - if (metadata != NULL) { - delete metadata; - env->SetLongField(thiz, fields.metadata_ptr, 0); + if (thiz != nullptr) { + auto metadata = reinterpret_cast<std::shared_ptr<CameraMetadata> *>( + env->GetLongField(thiz, fields.metadata_ptr)); + if (metadata != nullptr) { + delete metadata; + env->SetLongField(thiz, fields.metadata_ptr, 0); + } } - LOG_ALWAYS_FATAL_IF(CameraMetadata_getPointerNoThrow(env, thiz) != NULL, + LOG_ALWAYS_FATAL_IF(CameraMetadata_getPointerNoThrow(env, thiz) != nullptr, "Expected the native ptr to be 0 after #close"); } |