summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/hardware/camera2/CameraMetadata.java2
-rw-r--r--core/java/android/hardware/camera2/impl/CameraMetadataNative.java2
-rw-r--r--core/jni/android_hardware_camera2_CameraMetadata.cpp41
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");
}