Loading core/java/android/hardware/camera2/impl/CameraMetadataNative.java +51 −34 Original line number Diff line number Diff line Loading @@ -71,6 +71,8 @@ import android.util.Log; import android.util.Range; import android.util.Size; import dalvik.annotation.optimization.FastNative; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; Loading Loading @@ -356,7 +358,7 @@ public class CameraMetadataNative implements Parcelable { */ public CameraMetadataNative(CameraMetadataNative other) { super(); mMetadataPtr = nativeAllocateCopy(other); mMetadataPtr = nativeAllocateCopy(other.mMetadataPtr); if (mMetadataPtr == 0) { throw new OutOfMemoryError("Failed to allocate native CameraMetadata"); } Loading Loading @@ -398,7 +400,7 @@ public class CameraMetadataNative implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { nativeWriteToParcel(dest); nativeWriteToParcel(dest, mMetadataPtr); } /** Loading Loading @@ -440,7 +442,7 @@ public class CameraMetadataNative implements Parcelable { } public void readFromParcel(Parcel in) { nativeReadFromParcel(in); nativeReadFromParcel(in, mMetadataPtr); } /** Loading Loading @@ -528,9 +530,9 @@ public class CameraMetadataNative implements Parcelable { public static final int NUM_TYPES = 6; private void close() { // this sets mMetadataPtr to 0 nativeClose(); mMetadataPtr = 0; // set it to 0 again to prevent eclipse from making this field final // Delete native pointer, but does not clear it nativeClose(mMetadataPtr); mMetadataPtr = 0; } private <T> T getBase(CameraCharacteristics.Key<T> key) { Loading @@ -550,7 +552,7 @@ public class CameraMetadataNative implements Parcelable { if (key.hasTag()) { tag = key.getTag(); } else { tag = nativeGetTagFromKeyLocal(key.getName()); tag = nativeGetTagFromKeyLocal(mMetadataPtr, key.getName()); key.cacheTag(tag); } byte[] values = readValues(tag); Loading @@ -560,14 +562,14 @@ public class CameraMetadataNative implements Parcelable { if (key.mFallbackName == null) { return null; } tag = nativeGetTagFromKeyLocal(key.mFallbackName); tag = nativeGetTagFromKeyLocal(mMetadataPtr, key.mFallbackName); values = readValues(tag); if (values == null) { return null; } } int nativeType = nativeGetTypeFromTagLocal(tag); int nativeType = nativeGetTypeFromTagLocal(mMetadataPtr, tag); Marshaler<T> marshaler = getMarshalerForKey(key, nativeType); ByteBuffer buffer = ByteBuffer.wrap(values).order(ByteOrder.nativeOrder()); return marshaler.unmarshal(buffer); Loading Loading @@ -1514,7 +1516,7 @@ public class CameraMetadataNative implements Parcelable { if (key.hasTag()) { tag = key.getTag(); } else { tag = nativeGetTagFromKeyLocal(key.getName()); tag = nativeGetTagFromKeyLocal(mMetadataPtr, key.getName()); key.cacheTag(tag); } if (value == null) { Loading @@ -1523,7 +1525,7 @@ public class CameraMetadataNative implements Parcelable { return; } // else update the entry to a new value int nativeType = nativeGetTypeFromTagLocal(tag); int nativeType = nativeGetTypeFromTagLocal(mMetadataPtr, tag); Marshaler<T> marshaler = getMarshalerForKey(key, nativeType); int size = marshaler.calculateMarshalSize(value); Loading Loading @@ -1684,32 +1686,47 @@ public class CameraMetadataNative implements Parcelable { @UnsupportedAppUsage private long mMetadataPtr; // native std::shared_ptr<CameraMetadata>* private native long nativeAllocate(); private native long nativeAllocateCopy(CameraMetadataNative other) @FastNative private static native long nativeAllocate(); @FastNative private static native long nativeAllocateCopy(long ptr) throws NullPointerException; private native synchronized void nativeWriteToParcel(Parcel dest); private native synchronized void nativeReadFromParcel(Parcel source); private native synchronized void nativeSwap(CameraMetadataNative other) @FastNative private static synchronized native void nativeWriteToParcel(Parcel dest, long ptr); @FastNative private static synchronized native void nativeReadFromParcel(Parcel source, long ptr); @FastNative private static synchronized native void nativeSwap(long ptr, long otherPtr) throws NullPointerException; private native synchronized void nativeClose(); private native synchronized boolean nativeIsEmpty(); private native synchronized int nativeGetEntryCount(); @FastNative private static synchronized native void nativeClose(long ptr); @FastNative private static synchronized native boolean nativeIsEmpty(long ptr); @FastNative private static synchronized native int nativeGetEntryCount(long ptr); @UnsupportedAppUsage private native synchronized byte[] nativeReadValues(int tag); private native synchronized void nativeWriteValues(int tag, byte[] src); private native synchronized void nativeDump() throws IOException; // dump to ALOGD private native synchronized ArrayList nativeGetAllVendorKeys(Class keyClass); @FastNative private static synchronized native byte[] nativeReadValues(int tag, long ptr); @FastNative private static synchronized native void nativeWriteValues(int tag, byte[] src, long ptr); private static synchronized native void nativeDump(long ptr) throws IOException; // dump to LOGD @FastNative private static synchronized native ArrayList nativeGetAllVendorKeys(long ptr, Class keyClass); @UnsupportedAppUsage private native synchronized int nativeGetTagFromKeyLocal(String keyName) @FastNative private static synchronized native int nativeGetTagFromKeyLocal(long ptr, String keyName) throws IllegalArgumentException; @UnsupportedAppUsage private native synchronized int nativeGetTypeFromTagLocal(int tag) @FastNative private static synchronized native int nativeGetTypeFromTagLocal(long ptr, int tag) throws IllegalArgumentException; @FastNative private static native int nativeGetTagFromKey(String keyName, long vendorId) throws IllegalArgumentException; @FastNative private static native int nativeGetTypeFromTag(int tag, long vendorId) throws IllegalArgumentException; Loading @@ -1723,7 +1740,7 @@ public class CameraMetadataNative implements Parcelable { * @hide */ public void swap(CameraMetadataNative other) { nativeSwap(other); nativeSwap(mMetadataPtr, other.mMetadataPtr); mCameraId = other.mCameraId; mHasMandatoryConcurrentStreams = other.mHasMandatoryConcurrentStreams; mDisplaySize = other.mDisplaySize; Loading @@ -1733,7 +1750,7 @@ public class CameraMetadataNative implements Parcelable { * @hide */ public int getEntryCount() { return nativeGetEntryCount(); return nativeGetEntryCount(mMetadataPtr); } /** Loading @@ -1742,12 +1759,12 @@ public class CameraMetadataNative implements Parcelable { * @hide */ public boolean isEmpty() { return nativeIsEmpty(); return nativeIsEmpty(mMetadataPtr); } /** * Retrieves the pointer to the native CameraMetadata as a Java long. * Retrieves the pointer to the native shared_ptr<CameraMetadata> as a Java long. * * @hide */ Loading @@ -1764,7 +1781,7 @@ public class CameraMetadataNative implements Parcelable { if (keyClass == null) { throw new NullPointerException(); } return (ArrayList<K>) nativeGetAllVendorKeys(keyClass); return (ArrayList<K>) nativeGetAllVendorKeys(mMetadataPtr, keyClass); } /** Loading Loading @@ -1816,7 +1833,7 @@ public class CameraMetadataNative implements Parcelable { * @hide */ public void writeValues(int tag, byte[] src) { nativeWriteValues(tag, src); nativeWriteValues(tag, src, mMetadataPtr); } /** Loading @@ -1832,7 +1849,7 @@ public class CameraMetadataNative implements Parcelable { */ public byte[] readValues(int tag) { // TODO: Optimization. Native code returns a ByteBuffer instead. return nativeReadValues(tag); return nativeReadValues(tag, mMetadataPtr); } /** Loading @@ -1845,7 +1862,7 @@ public class CameraMetadataNative implements Parcelable { */ public void dumpToLog() { try { nativeDump(); nativeDump(mMetadataPtr); } catch (IOException e) { Log.wtf(TAG, "Dump logging failed", e); } Loading core/jni/android_hardware_camera2_CameraMetadata.cpp +70 −82 Original line number Diff line number Diff line Loading @@ -162,20 +162,23 @@ struct Helpers { extern "C" { static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jobject thiz, jclass keyType); static jint CameraMetadata_getTagFromKey(JNIEnv *env, jobject thiz, jstring keyName, jlong vendorId); static jint CameraMetadata_getTagFromKeyLocal(JNIEnv *env, jobject thiz, jstring keyName); static jint CameraMetadata_getTypeFromTag(JNIEnv *env, jobject thiz, jint tag, jlong vendorId); static jint CameraMetadata_getTypeFromTagLocal(JNIEnv *env, jobject thiz, jint tag); static jint CameraMetadata_setupGlobalVendorTagDescriptor(JNIEnv *env, jobject thiz); static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jclass thiz, jlong ptr, jclass keyType); static jint CameraMetadata_getTagFromKey(JNIEnv *env, jclass thiz, jstring keyName, jlong vendorId); static jint CameraMetadata_getTagFromKeyLocal(JNIEnv *env, jclass thiz, jlong ptr, jstring keyName); static jint CameraMetadata_getTypeFromTag(JNIEnv *env, jclass thiz, jint tag, jlong vendorId); static jint CameraMetadata_getTypeFromTagLocal(JNIEnv *env, jclass thiz, jlong ptr, jint tag); static jint CameraMetadata_setupGlobalVendorTagDescriptor(JNIEnv *env, jclass thiz); // Less safe access to native pointer. Does NOT throw any Java exceptions if NULL. static CameraMetadata* CameraMetadata_getPointerNoThrow(JNIEnv *env, jobject thiz) { if (thiz == nullptr) { return nullptr; static std::shared_ptr<CameraMetadata>* CameraMetadata_getSharedPtr(jlong metadataLongPtr) { return reinterpret_cast<std::shared_ptr<CameraMetadata>* >(metadataLongPtr); } auto metadata = reinterpret_cast<std::shared_ptr<CameraMetadata> *>( env->GetLongField(thiz, fields.metadata_ptr)); // Less safe access to native pointer. Does NOT throw any Java exceptions if NULL. static CameraMetadata* CameraMetadata_getPointerNoThrow(jlong ptr) { auto metadata = CameraMetadata_getSharedPtr(ptr); if (metadata == nullptr) { return nullptr; } Loading @@ -183,40 +186,31 @@ static CameraMetadata* CameraMetadata_getPointerNoThrow(JNIEnv *env, jobject thi } // Safe access to native pointer from object. Throws if not possible to access. static CameraMetadata* CameraMetadata_getPointerThrow(JNIEnv *env, jobject thiz, static CameraMetadata* CameraMetadata_getPointerThrow(JNIEnv *env, jlong ptr, const char* argName = "this") { if (thiz == NULL) { ALOGV("%s: Throwing java.lang.NullPointerException for null reference", __FUNCTION__); jniThrowNullPointerException(env, argName); return NULL; } CameraMetadata* metadata = CameraMetadata_getPointerNoThrow(env, thiz); if (metadata == NULL) { CameraMetadata* metadata = CameraMetadata_getPointerNoThrow(ptr); if (metadata == nullptr) { ALOGV("%s: Throwing java.lang.IllegalStateException for closed object", __FUNCTION__); jniThrowException(env, "java/lang/IllegalStateException", "Metadata object was already closed"); return NULL; return nullptr; } return metadata; } static jlong CameraMetadata_allocate(JNIEnv *env, jobject thiz) { static jlong CameraMetadata_allocate(JNIEnv *env, jclass thiz) { ALOGV("%s", __FUNCTION__); return reinterpret_cast<jlong>(new std::shared_ptr<CameraMetadata>(new CameraMetadata())); } static jlong CameraMetadata_allocateCopy(JNIEnv *env, jobject thiz, jobject other) { static jlong CameraMetadata_allocateCopy(JNIEnv *env, jclass thiz, jlong other) { ALOGV("%s", __FUNCTION__); CameraMetadata* otherMetadata = CameraMetadata_getPointerThrow(env, other, "other"); CameraMetadata_getPointerThrow(env, other); // In case of exception, return if (otherMetadata == NULL) return NULL; Loading @@ -226,10 +220,10 @@ static jlong CameraMetadata_allocateCopy(JNIEnv *env, jobject thiz, } static jboolean CameraMetadata_isEmpty(JNIEnv *env, jobject thiz) { static jboolean CameraMetadata_isEmpty(JNIEnv *env, jclass thiz, jlong ptr) { ALOGV("%s", __FUNCTION__); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) { ALOGW("%s: Returning early due to exception being thrown", Loading @@ -245,10 +239,10 @@ static jboolean CameraMetadata_isEmpty(JNIEnv *env, jobject thiz) { return empty; } static jint CameraMetadata_getEntryCount(JNIEnv *env, jobject thiz) { static jint CameraMetadata_getEntryCount(JNIEnv *env, jclass thiz, jlong ptr) { ALOGV("%s", __FUNCTION__); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) return 0; // actually throws java exc. Loading @@ -256,42 +250,33 @@ static jint CameraMetadata_getEntryCount(JNIEnv *env, jobject thiz) { } // idempotent. calling more than once has no effect. static void CameraMetadata_close(JNIEnv *env, jobject thiz) { static void CameraMetadata_close(JNIEnv *env, jclass thiz, jlong ptr) { ALOGV("%s", __FUNCTION__); if (thiz != nullptr) { auto metadata = reinterpret_cast<std::shared_ptr<CameraMetadata> *>( env->GetLongField(thiz, fields.metadata_ptr)); auto metadata = CameraMetadata_getSharedPtr(ptr); if (metadata != nullptr) { delete metadata; env->SetLongField(thiz, fields.metadata_ptr, 0); } } LOG_ALWAYS_FATAL_IF(CameraMetadata_getPointerNoThrow(env, thiz) != nullptr, "Expected the native ptr to be 0 after #close"); } static void CameraMetadata_swap(JNIEnv *env, jobject thiz, jobject other) { static void CameraMetadata_swap(JNIEnv *env, jclass thiz, jlong ptr, jlong other) { ALOGV("%s", __FUNCTION__); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); auto metadata = CameraMetadata_getSharedPtr(ptr); auto otherMetadata = CameraMetadata_getSharedPtr(other); // order is important: we can't call another JNI method // if there is an exception pending if (metadata == NULL) return; CameraMetadata* otherMetadata = CameraMetadata_getPointerThrow(env, other, "other"); if (otherMetadata == NULL) return; // Need to swap shared pointers, not CameraMetadata, since the latter may be in use // by an NDK client, and we don't want to swap their data out from under them. metadata->swap(*otherMetadata); } static jbyteArray CameraMetadata_readValues(JNIEnv *env, jobject thiz, jint tag) { static jbyteArray CameraMetadata_readValues(JNIEnv *env, jclass thiz, jint tag, jlong ptr) { ALOGV("%s (tag = %d)", __FUNCTION__, tag); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) return NULL; const camera_metadata_t *metaBuffer = metadata->getAndLock(); Loading Loading @@ -327,10 +312,11 @@ static jbyteArray CameraMetadata_readValues(JNIEnv *env, jobject thiz, jint tag) return byteArray; } static void CameraMetadata_writeValues(JNIEnv *env, jobject thiz, jint tag, jbyteArray src) { static void CameraMetadata_writeValues(JNIEnv *env, jclass thiz, jint tag, jbyteArray src, jlong ptr) { ALOGV("%s (tag = %d)", __FUNCTION__, tag); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) return; const camera_metadata_t *metaBuffer = metadata->getAndLock(); Loading Loading @@ -400,9 +386,9 @@ static void* CameraMetadata_writeMetadataThread(void* arg) { return NULL; } static void CameraMetadata_dump(JNIEnv *env, jobject thiz) { static void CameraMetadata_dump(JNIEnv *env, jclass thiz, jlong ptr) { ALOGV("%s", __FUNCTION__); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) { return; } Loading Loading @@ -496,9 +482,9 @@ static void CameraMetadata_dump(JNIEnv *env, jobject thiz) { } } static void CameraMetadata_readFromParcel(JNIEnv *env, jobject thiz, jobject parcel) { static void CameraMetadata_readFromParcel(JNIEnv *env, jclass thiz, jobject parcel, jlong ptr) { ALOGV("%s", __FUNCTION__); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) { return; } Loading @@ -517,9 +503,9 @@ static void CameraMetadata_readFromParcel(JNIEnv *env, jobject thiz, jobject par } } static void CameraMetadata_writeToParcel(JNIEnv *env, jobject thiz, jobject parcel) { static void CameraMetadata_writeToParcel(JNIEnv *env, jclass thiz, jobject parcel, jlong ptr) { ALOGV("%s", __FUNCTION__); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) { return; } Loading Loading @@ -558,44 +544,44 @@ static const JNINativeMethod gCameraMetadataMethods[] = { "()J", (void*)CameraMetadata_allocate }, { "nativeAllocateCopy", "(L" CAMERA_METADATA_CLASS_NAME ";)J", "(J)J", (void *)CameraMetadata_allocateCopy }, { "nativeIsEmpty", "()Z", "(J)Z", (void*)CameraMetadata_isEmpty }, { "nativeGetEntryCount", "()I", "(J)I", (void*)CameraMetadata_getEntryCount }, { "nativeClose", "()V", "(J)V", (void*)CameraMetadata_close }, { "nativeSwap", "(L" CAMERA_METADATA_CLASS_NAME ";)V", "(JJ)V", (void *)CameraMetadata_swap }, { "nativeGetTagFromKeyLocal", "(Ljava/lang/String;)I", "(JLjava/lang/String;)I", (void *)CameraMetadata_getTagFromKeyLocal }, { "nativeGetTypeFromTagLocal", "(I)I", "(JI)I", (void *)CameraMetadata_getTypeFromTagLocal }, { "nativeReadValues", "(I)[B", "(IJ)[B", (void *)CameraMetadata_readValues }, { "nativeWriteValues", "(I[B)V", "(I[BJ)V", (void *)CameraMetadata_writeValues }, { "nativeDump", "()V", "(J)V", (void *)CameraMetadata_dump }, { "nativeGetAllVendorKeys", "(Ljava/lang/Class;)Ljava/util/ArrayList;", "(JLjava/lang/Class;)Ljava/util/ArrayList;", (void *)CameraMetadata_getAllVendorKeys}, // Parcelable interface { "nativeReadFromParcel", "(Landroid/os/Parcel;)V", "(Landroid/os/Parcel;J)V", (void *)CameraMetadata_readFromParcel }, { "nativeWriteToParcel", "(Landroid/os/Parcel;)V", "(Landroid/os/Parcel;J)V", (void *)CameraMetadata_writeToParcel }, }; Loading Loading @@ -652,8 +638,8 @@ int register_android_hardware_camera2_CameraMetadata(JNIEnv *env) extern "C" { static jint CameraMetadata_getTypeFromTagLocal(JNIEnv *env, jobject thiz, jint tag) { CameraMetadata* metadata = CameraMetadata_getPointerNoThrow(env, thiz); static jint CameraMetadata_getTypeFromTagLocal(JNIEnv *env, jclass thiz, jlong ptr, jint tag) { CameraMetadata* metadata = CameraMetadata_getPointerNoThrow(ptr); metadata_vendor_id_t vendorId = CAMERA_METADATA_INVALID_VENDOR_ID; if (metadata) { const camera_metadata_t *metaBuffer = metadata->getAndLock(); Loading @@ -671,7 +657,8 @@ static jint CameraMetadata_getTypeFromTagLocal(JNIEnv *env, jobject thiz, jint t return tagType; } static jint CameraMetadata_getTagFromKeyLocal(JNIEnv *env, jobject thiz, jstring keyName) { static jint CameraMetadata_getTagFromKeyLocal(JNIEnv *env, jclass thiz, jlong ptr, jstring keyName) { ScopedUtfChars keyScoped(env, keyName); const char *key = keyScoped.c_str(); if (key == NULL) { Loading @@ -682,7 +669,7 @@ static jint CameraMetadata_getTagFromKeyLocal(JNIEnv *env, jobject thiz, jstring uint32_t tag = 0; sp<VendorTagDescriptor> vTags; CameraMetadata* metadata = CameraMetadata_getPointerNoThrow(env, thiz); CameraMetadata* metadata = CameraMetadata_getPointerNoThrow(ptr); if (metadata) { sp<VendorTagDescriptorCache> cache = VendorTagDescriptorCache::getGlobalVendorTagCache(); if (cache.get()) { Loading @@ -701,7 +688,8 @@ static jint CameraMetadata_getTagFromKeyLocal(JNIEnv *env, jobject thiz, jstring return tag; } static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jobject thiz, jclass keyType) { static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jclass thiz, jlong ptr, jclass keyType) { metadata_vendor_id_t vendorId = CAMERA_METADATA_INVALID_VENDOR_ID; // Get all vendor tags sp<VendorTagDescriptor> vTags = VendorTagDescriptor::getGlobalVendorTagDescriptor(); Loading @@ -712,7 +700,7 @@ static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jobject thiz, jclass return nullptr; } CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) return NULL; const camera_metadata_t *metaBuffer = metadata->getAndLock(); Loading Loading @@ -816,7 +804,7 @@ static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jobject thiz, jclass return arrayList; } static jint CameraMetadata_getTagFromKey(JNIEnv *env, jobject thiz, jstring keyName, static jint CameraMetadata_getTagFromKey(JNIEnv *env, jclass thiz, jstring keyName, jlong vendorId) { ScopedUtfChars keyScoped(env, keyName); const char *key = keyScoped.c_str(); Loading Loading @@ -844,7 +832,7 @@ static jint CameraMetadata_getTagFromKey(JNIEnv *env, jobject thiz, jstring keyN return tag; } static jint CameraMetadata_getTypeFromTag(JNIEnv *env, jobject thiz, jint tag, jlong vendorId) { static jint CameraMetadata_getTypeFromTag(JNIEnv *env, jclass thiz, jint tag, jlong vendorId) { int tagType = get_local_camera_metadata_tag_type_vendor_id(tag, vendorId); if (tagType == -1) { jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", Loading @@ -855,7 +843,7 @@ static jint CameraMetadata_getTypeFromTag(JNIEnv *env, jobject thiz, jint tag, j return tagType; } static jint CameraMetadata_setupGlobalVendorTagDescriptor(JNIEnv *env, jobject thiz) { static jint CameraMetadata_setupGlobalVendorTagDescriptor(JNIEnv *env, jclass thiz) { const String16 NAME("media.camera"); sp<hardware::ICameraService> cameraService; status_t err = getService(NAME, /*out*/&cameraService); Loading Loading
core/java/android/hardware/camera2/impl/CameraMetadataNative.java +51 −34 Original line number Diff line number Diff line Loading @@ -71,6 +71,8 @@ import android.util.Log; import android.util.Range; import android.util.Size; import dalvik.annotation.optimization.FastNative; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; Loading Loading @@ -356,7 +358,7 @@ public class CameraMetadataNative implements Parcelable { */ public CameraMetadataNative(CameraMetadataNative other) { super(); mMetadataPtr = nativeAllocateCopy(other); mMetadataPtr = nativeAllocateCopy(other.mMetadataPtr); if (mMetadataPtr == 0) { throw new OutOfMemoryError("Failed to allocate native CameraMetadata"); } Loading Loading @@ -398,7 +400,7 @@ public class CameraMetadataNative implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { nativeWriteToParcel(dest); nativeWriteToParcel(dest, mMetadataPtr); } /** Loading Loading @@ -440,7 +442,7 @@ public class CameraMetadataNative implements Parcelable { } public void readFromParcel(Parcel in) { nativeReadFromParcel(in); nativeReadFromParcel(in, mMetadataPtr); } /** Loading Loading @@ -528,9 +530,9 @@ public class CameraMetadataNative implements Parcelable { public static final int NUM_TYPES = 6; private void close() { // this sets mMetadataPtr to 0 nativeClose(); mMetadataPtr = 0; // set it to 0 again to prevent eclipse from making this field final // Delete native pointer, but does not clear it nativeClose(mMetadataPtr); mMetadataPtr = 0; } private <T> T getBase(CameraCharacteristics.Key<T> key) { Loading @@ -550,7 +552,7 @@ public class CameraMetadataNative implements Parcelable { if (key.hasTag()) { tag = key.getTag(); } else { tag = nativeGetTagFromKeyLocal(key.getName()); tag = nativeGetTagFromKeyLocal(mMetadataPtr, key.getName()); key.cacheTag(tag); } byte[] values = readValues(tag); Loading @@ -560,14 +562,14 @@ public class CameraMetadataNative implements Parcelable { if (key.mFallbackName == null) { return null; } tag = nativeGetTagFromKeyLocal(key.mFallbackName); tag = nativeGetTagFromKeyLocal(mMetadataPtr, key.mFallbackName); values = readValues(tag); if (values == null) { return null; } } int nativeType = nativeGetTypeFromTagLocal(tag); int nativeType = nativeGetTypeFromTagLocal(mMetadataPtr, tag); Marshaler<T> marshaler = getMarshalerForKey(key, nativeType); ByteBuffer buffer = ByteBuffer.wrap(values).order(ByteOrder.nativeOrder()); return marshaler.unmarshal(buffer); Loading Loading @@ -1514,7 +1516,7 @@ public class CameraMetadataNative implements Parcelable { if (key.hasTag()) { tag = key.getTag(); } else { tag = nativeGetTagFromKeyLocal(key.getName()); tag = nativeGetTagFromKeyLocal(mMetadataPtr, key.getName()); key.cacheTag(tag); } if (value == null) { Loading @@ -1523,7 +1525,7 @@ public class CameraMetadataNative implements Parcelable { return; } // else update the entry to a new value int nativeType = nativeGetTypeFromTagLocal(tag); int nativeType = nativeGetTypeFromTagLocal(mMetadataPtr, tag); Marshaler<T> marshaler = getMarshalerForKey(key, nativeType); int size = marshaler.calculateMarshalSize(value); Loading Loading @@ -1684,32 +1686,47 @@ public class CameraMetadataNative implements Parcelable { @UnsupportedAppUsage private long mMetadataPtr; // native std::shared_ptr<CameraMetadata>* private native long nativeAllocate(); private native long nativeAllocateCopy(CameraMetadataNative other) @FastNative private static native long nativeAllocate(); @FastNative private static native long nativeAllocateCopy(long ptr) throws NullPointerException; private native synchronized void nativeWriteToParcel(Parcel dest); private native synchronized void nativeReadFromParcel(Parcel source); private native synchronized void nativeSwap(CameraMetadataNative other) @FastNative private static synchronized native void nativeWriteToParcel(Parcel dest, long ptr); @FastNative private static synchronized native void nativeReadFromParcel(Parcel source, long ptr); @FastNative private static synchronized native void nativeSwap(long ptr, long otherPtr) throws NullPointerException; private native synchronized void nativeClose(); private native synchronized boolean nativeIsEmpty(); private native synchronized int nativeGetEntryCount(); @FastNative private static synchronized native void nativeClose(long ptr); @FastNative private static synchronized native boolean nativeIsEmpty(long ptr); @FastNative private static synchronized native int nativeGetEntryCount(long ptr); @UnsupportedAppUsage private native synchronized byte[] nativeReadValues(int tag); private native synchronized void nativeWriteValues(int tag, byte[] src); private native synchronized void nativeDump() throws IOException; // dump to ALOGD private native synchronized ArrayList nativeGetAllVendorKeys(Class keyClass); @FastNative private static synchronized native byte[] nativeReadValues(int tag, long ptr); @FastNative private static synchronized native void nativeWriteValues(int tag, byte[] src, long ptr); private static synchronized native void nativeDump(long ptr) throws IOException; // dump to LOGD @FastNative private static synchronized native ArrayList nativeGetAllVendorKeys(long ptr, Class keyClass); @UnsupportedAppUsage private native synchronized int nativeGetTagFromKeyLocal(String keyName) @FastNative private static synchronized native int nativeGetTagFromKeyLocal(long ptr, String keyName) throws IllegalArgumentException; @UnsupportedAppUsage private native synchronized int nativeGetTypeFromTagLocal(int tag) @FastNative private static synchronized native int nativeGetTypeFromTagLocal(long ptr, int tag) throws IllegalArgumentException; @FastNative private static native int nativeGetTagFromKey(String keyName, long vendorId) throws IllegalArgumentException; @FastNative private static native int nativeGetTypeFromTag(int tag, long vendorId) throws IllegalArgumentException; Loading @@ -1723,7 +1740,7 @@ public class CameraMetadataNative implements Parcelable { * @hide */ public void swap(CameraMetadataNative other) { nativeSwap(other); nativeSwap(mMetadataPtr, other.mMetadataPtr); mCameraId = other.mCameraId; mHasMandatoryConcurrentStreams = other.mHasMandatoryConcurrentStreams; mDisplaySize = other.mDisplaySize; Loading @@ -1733,7 +1750,7 @@ public class CameraMetadataNative implements Parcelable { * @hide */ public int getEntryCount() { return nativeGetEntryCount(); return nativeGetEntryCount(mMetadataPtr); } /** Loading @@ -1742,12 +1759,12 @@ public class CameraMetadataNative implements Parcelable { * @hide */ public boolean isEmpty() { return nativeIsEmpty(); return nativeIsEmpty(mMetadataPtr); } /** * Retrieves the pointer to the native CameraMetadata as a Java long. * Retrieves the pointer to the native shared_ptr<CameraMetadata> as a Java long. * * @hide */ Loading @@ -1764,7 +1781,7 @@ public class CameraMetadataNative implements Parcelable { if (keyClass == null) { throw new NullPointerException(); } return (ArrayList<K>) nativeGetAllVendorKeys(keyClass); return (ArrayList<K>) nativeGetAllVendorKeys(mMetadataPtr, keyClass); } /** Loading Loading @@ -1816,7 +1833,7 @@ public class CameraMetadataNative implements Parcelable { * @hide */ public void writeValues(int tag, byte[] src) { nativeWriteValues(tag, src); nativeWriteValues(tag, src, mMetadataPtr); } /** Loading @@ -1832,7 +1849,7 @@ public class CameraMetadataNative implements Parcelable { */ public byte[] readValues(int tag) { // TODO: Optimization. Native code returns a ByteBuffer instead. return nativeReadValues(tag); return nativeReadValues(tag, mMetadataPtr); } /** Loading @@ -1845,7 +1862,7 @@ public class CameraMetadataNative implements Parcelable { */ public void dumpToLog() { try { nativeDump(); nativeDump(mMetadataPtr); } catch (IOException e) { Log.wtf(TAG, "Dump logging failed", e); } Loading
core/jni/android_hardware_camera2_CameraMetadata.cpp +70 −82 Original line number Diff line number Diff line Loading @@ -162,20 +162,23 @@ struct Helpers { extern "C" { static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jobject thiz, jclass keyType); static jint CameraMetadata_getTagFromKey(JNIEnv *env, jobject thiz, jstring keyName, jlong vendorId); static jint CameraMetadata_getTagFromKeyLocal(JNIEnv *env, jobject thiz, jstring keyName); static jint CameraMetadata_getTypeFromTag(JNIEnv *env, jobject thiz, jint tag, jlong vendorId); static jint CameraMetadata_getTypeFromTagLocal(JNIEnv *env, jobject thiz, jint tag); static jint CameraMetadata_setupGlobalVendorTagDescriptor(JNIEnv *env, jobject thiz); static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jclass thiz, jlong ptr, jclass keyType); static jint CameraMetadata_getTagFromKey(JNIEnv *env, jclass thiz, jstring keyName, jlong vendorId); static jint CameraMetadata_getTagFromKeyLocal(JNIEnv *env, jclass thiz, jlong ptr, jstring keyName); static jint CameraMetadata_getTypeFromTag(JNIEnv *env, jclass thiz, jint tag, jlong vendorId); static jint CameraMetadata_getTypeFromTagLocal(JNIEnv *env, jclass thiz, jlong ptr, jint tag); static jint CameraMetadata_setupGlobalVendorTagDescriptor(JNIEnv *env, jclass thiz); // Less safe access to native pointer. Does NOT throw any Java exceptions if NULL. static CameraMetadata* CameraMetadata_getPointerNoThrow(JNIEnv *env, jobject thiz) { if (thiz == nullptr) { return nullptr; static std::shared_ptr<CameraMetadata>* CameraMetadata_getSharedPtr(jlong metadataLongPtr) { return reinterpret_cast<std::shared_ptr<CameraMetadata>* >(metadataLongPtr); } auto metadata = reinterpret_cast<std::shared_ptr<CameraMetadata> *>( env->GetLongField(thiz, fields.metadata_ptr)); // Less safe access to native pointer. Does NOT throw any Java exceptions if NULL. static CameraMetadata* CameraMetadata_getPointerNoThrow(jlong ptr) { auto metadata = CameraMetadata_getSharedPtr(ptr); if (metadata == nullptr) { return nullptr; } Loading @@ -183,40 +186,31 @@ static CameraMetadata* CameraMetadata_getPointerNoThrow(JNIEnv *env, jobject thi } // Safe access to native pointer from object. Throws if not possible to access. static CameraMetadata* CameraMetadata_getPointerThrow(JNIEnv *env, jobject thiz, static CameraMetadata* CameraMetadata_getPointerThrow(JNIEnv *env, jlong ptr, const char* argName = "this") { if (thiz == NULL) { ALOGV("%s: Throwing java.lang.NullPointerException for null reference", __FUNCTION__); jniThrowNullPointerException(env, argName); return NULL; } CameraMetadata* metadata = CameraMetadata_getPointerNoThrow(env, thiz); if (metadata == NULL) { CameraMetadata* metadata = CameraMetadata_getPointerNoThrow(ptr); if (metadata == nullptr) { ALOGV("%s: Throwing java.lang.IllegalStateException for closed object", __FUNCTION__); jniThrowException(env, "java/lang/IllegalStateException", "Metadata object was already closed"); return NULL; return nullptr; } return metadata; } static jlong CameraMetadata_allocate(JNIEnv *env, jobject thiz) { static jlong CameraMetadata_allocate(JNIEnv *env, jclass thiz) { ALOGV("%s", __FUNCTION__); return reinterpret_cast<jlong>(new std::shared_ptr<CameraMetadata>(new CameraMetadata())); } static jlong CameraMetadata_allocateCopy(JNIEnv *env, jobject thiz, jobject other) { static jlong CameraMetadata_allocateCopy(JNIEnv *env, jclass thiz, jlong other) { ALOGV("%s", __FUNCTION__); CameraMetadata* otherMetadata = CameraMetadata_getPointerThrow(env, other, "other"); CameraMetadata_getPointerThrow(env, other); // In case of exception, return if (otherMetadata == NULL) return NULL; Loading @@ -226,10 +220,10 @@ static jlong CameraMetadata_allocateCopy(JNIEnv *env, jobject thiz, } static jboolean CameraMetadata_isEmpty(JNIEnv *env, jobject thiz) { static jboolean CameraMetadata_isEmpty(JNIEnv *env, jclass thiz, jlong ptr) { ALOGV("%s", __FUNCTION__); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) { ALOGW("%s: Returning early due to exception being thrown", Loading @@ -245,10 +239,10 @@ static jboolean CameraMetadata_isEmpty(JNIEnv *env, jobject thiz) { return empty; } static jint CameraMetadata_getEntryCount(JNIEnv *env, jobject thiz) { static jint CameraMetadata_getEntryCount(JNIEnv *env, jclass thiz, jlong ptr) { ALOGV("%s", __FUNCTION__); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) return 0; // actually throws java exc. Loading @@ -256,42 +250,33 @@ static jint CameraMetadata_getEntryCount(JNIEnv *env, jobject thiz) { } // idempotent. calling more than once has no effect. static void CameraMetadata_close(JNIEnv *env, jobject thiz) { static void CameraMetadata_close(JNIEnv *env, jclass thiz, jlong ptr) { ALOGV("%s", __FUNCTION__); if (thiz != nullptr) { auto metadata = reinterpret_cast<std::shared_ptr<CameraMetadata> *>( env->GetLongField(thiz, fields.metadata_ptr)); auto metadata = CameraMetadata_getSharedPtr(ptr); if (metadata != nullptr) { delete metadata; env->SetLongField(thiz, fields.metadata_ptr, 0); } } LOG_ALWAYS_FATAL_IF(CameraMetadata_getPointerNoThrow(env, thiz) != nullptr, "Expected the native ptr to be 0 after #close"); } static void CameraMetadata_swap(JNIEnv *env, jobject thiz, jobject other) { static void CameraMetadata_swap(JNIEnv *env, jclass thiz, jlong ptr, jlong other) { ALOGV("%s", __FUNCTION__); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); auto metadata = CameraMetadata_getSharedPtr(ptr); auto otherMetadata = CameraMetadata_getSharedPtr(other); // order is important: we can't call another JNI method // if there is an exception pending if (metadata == NULL) return; CameraMetadata* otherMetadata = CameraMetadata_getPointerThrow(env, other, "other"); if (otherMetadata == NULL) return; // Need to swap shared pointers, not CameraMetadata, since the latter may be in use // by an NDK client, and we don't want to swap their data out from under them. metadata->swap(*otherMetadata); } static jbyteArray CameraMetadata_readValues(JNIEnv *env, jobject thiz, jint tag) { static jbyteArray CameraMetadata_readValues(JNIEnv *env, jclass thiz, jint tag, jlong ptr) { ALOGV("%s (tag = %d)", __FUNCTION__, tag); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) return NULL; const camera_metadata_t *metaBuffer = metadata->getAndLock(); Loading Loading @@ -327,10 +312,11 @@ static jbyteArray CameraMetadata_readValues(JNIEnv *env, jobject thiz, jint tag) return byteArray; } static void CameraMetadata_writeValues(JNIEnv *env, jobject thiz, jint tag, jbyteArray src) { static void CameraMetadata_writeValues(JNIEnv *env, jclass thiz, jint tag, jbyteArray src, jlong ptr) { ALOGV("%s (tag = %d)", __FUNCTION__, tag); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) return; const camera_metadata_t *metaBuffer = metadata->getAndLock(); Loading Loading @@ -400,9 +386,9 @@ static void* CameraMetadata_writeMetadataThread(void* arg) { return NULL; } static void CameraMetadata_dump(JNIEnv *env, jobject thiz) { static void CameraMetadata_dump(JNIEnv *env, jclass thiz, jlong ptr) { ALOGV("%s", __FUNCTION__); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) { return; } Loading Loading @@ -496,9 +482,9 @@ static void CameraMetadata_dump(JNIEnv *env, jobject thiz) { } } static void CameraMetadata_readFromParcel(JNIEnv *env, jobject thiz, jobject parcel) { static void CameraMetadata_readFromParcel(JNIEnv *env, jclass thiz, jobject parcel, jlong ptr) { ALOGV("%s", __FUNCTION__); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) { return; } Loading @@ -517,9 +503,9 @@ static void CameraMetadata_readFromParcel(JNIEnv *env, jobject thiz, jobject par } } static void CameraMetadata_writeToParcel(JNIEnv *env, jobject thiz, jobject parcel) { static void CameraMetadata_writeToParcel(JNIEnv *env, jclass thiz, jobject parcel, jlong ptr) { ALOGV("%s", __FUNCTION__); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) { return; } Loading Loading @@ -558,44 +544,44 @@ static const JNINativeMethod gCameraMetadataMethods[] = { "()J", (void*)CameraMetadata_allocate }, { "nativeAllocateCopy", "(L" CAMERA_METADATA_CLASS_NAME ";)J", "(J)J", (void *)CameraMetadata_allocateCopy }, { "nativeIsEmpty", "()Z", "(J)Z", (void*)CameraMetadata_isEmpty }, { "nativeGetEntryCount", "()I", "(J)I", (void*)CameraMetadata_getEntryCount }, { "nativeClose", "()V", "(J)V", (void*)CameraMetadata_close }, { "nativeSwap", "(L" CAMERA_METADATA_CLASS_NAME ";)V", "(JJ)V", (void *)CameraMetadata_swap }, { "nativeGetTagFromKeyLocal", "(Ljava/lang/String;)I", "(JLjava/lang/String;)I", (void *)CameraMetadata_getTagFromKeyLocal }, { "nativeGetTypeFromTagLocal", "(I)I", "(JI)I", (void *)CameraMetadata_getTypeFromTagLocal }, { "nativeReadValues", "(I)[B", "(IJ)[B", (void *)CameraMetadata_readValues }, { "nativeWriteValues", "(I[B)V", "(I[BJ)V", (void *)CameraMetadata_writeValues }, { "nativeDump", "()V", "(J)V", (void *)CameraMetadata_dump }, { "nativeGetAllVendorKeys", "(Ljava/lang/Class;)Ljava/util/ArrayList;", "(JLjava/lang/Class;)Ljava/util/ArrayList;", (void *)CameraMetadata_getAllVendorKeys}, // Parcelable interface { "nativeReadFromParcel", "(Landroid/os/Parcel;)V", "(Landroid/os/Parcel;J)V", (void *)CameraMetadata_readFromParcel }, { "nativeWriteToParcel", "(Landroid/os/Parcel;)V", "(Landroid/os/Parcel;J)V", (void *)CameraMetadata_writeToParcel }, }; Loading Loading @@ -652,8 +638,8 @@ int register_android_hardware_camera2_CameraMetadata(JNIEnv *env) extern "C" { static jint CameraMetadata_getTypeFromTagLocal(JNIEnv *env, jobject thiz, jint tag) { CameraMetadata* metadata = CameraMetadata_getPointerNoThrow(env, thiz); static jint CameraMetadata_getTypeFromTagLocal(JNIEnv *env, jclass thiz, jlong ptr, jint tag) { CameraMetadata* metadata = CameraMetadata_getPointerNoThrow(ptr); metadata_vendor_id_t vendorId = CAMERA_METADATA_INVALID_VENDOR_ID; if (metadata) { const camera_metadata_t *metaBuffer = metadata->getAndLock(); Loading @@ -671,7 +657,8 @@ static jint CameraMetadata_getTypeFromTagLocal(JNIEnv *env, jobject thiz, jint t return tagType; } static jint CameraMetadata_getTagFromKeyLocal(JNIEnv *env, jobject thiz, jstring keyName) { static jint CameraMetadata_getTagFromKeyLocal(JNIEnv *env, jclass thiz, jlong ptr, jstring keyName) { ScopedUtfChars keyScoped(env, keyName); const char *key = keyScoped.c_str(); if (key == NULL) { Loading @@ -682,7 +669,7 @@ static jint CameraMetadata_getTagFromKeyLocal(JNIEnv *env, jobject thiz, jstring uint32_t tag = 0; sp<VendorTagDescriptor> vTags; CameraMetadata* metadata = CameraMetadata_getPointerNoThrow(env, thiz); CameraMetadata* metadata = CameraMetadata_getPointerNoThrow(ptr); if (metadata) { sp<VendorTagDescriptorCache> cache = VendorTagDescriptorCache::getGlobalVendorTagCache(); if (cache.get()) { Loading @@ -701,7 +688,8 @@ static jint CameraMetadata_getTagFromKeyLocal(JNIEnv *env, jobject thiz, jstring return tag; } static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jobject thiz, jclass keyType) { static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jclass thiz, jlong ptr, jclass keyType) { metadata_vendor_id_t vendorId = CAMERA_METADATA_INVALID_VENDOR_ID; // Get all vendor tags sp<VendorTagDescriptor> vTags = VendorTagDescriptor::getGlobalVendorTagDescriptor(); Loading @@ -712,7 +700,7 @@ static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jobject thiz, jclass return nullptr; } CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) return NULL; const camera_metadata_t *metaBuffer = metadata->getAndLock(); Loading Loading @@ -816,7 +804,7 @@ static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jobject thiz, jclass return arrayList; } static jint CameraMetadata_getTagFromKey(JNIEnv *env, jobject thiz, jstring keyName, static jint CameraMetadata_getTagFromKey(JNIEnv *env, jclass thiz, jstring keyName, jlong vendorId) { ScopedUtfChars keyScoped(env, keyName); const char *key = keyScoped.c_str(); Loading Loading @@ -844,7 +832,7 @@ static jint CameraMetadata_getTagFromKey(JNIEnv *env, jobject thiz, jstring keyN return tag; } static jint CameraMetadata_getTypeFromTag(JNIEnv *env, jobject thiz, jint tag, jlong vendorId) { static jint CameraMetadata_getTypeFromTag(JNIEnv *env, jclass thiz, jint tag, jlong vendorId) { int tagType = get_local_camera_metadata_tag_type_vendor_id(tag, vendorId); if (tagType == -1) { jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", Loading @@ -855,7 +843,7 @@ static jint CameraMetadata_getTypeFromTag(JNIEnv *env, jobject thiz, jint tag, j return tagType; } static jint CameraMetadata_setupGlobalVendorTagDescriptor(JNIEnv *env, jobject thiz) { static jint CameraMetadata_setupGlobalVendorTagDescriptor(JNIEnv *env, jclass thiz) { const String16 NAME("media.camera"); sp<hardware::ICameraService> cameraService; status_t err = getService(NAME, /*out*/&cameraService); Loading