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

Commit 2a4de9cf authored by Eino-Ville Talvala's avatar Eino-Ville Talvala Committed by Android (Google) Code Review
Browse files

Merge "Camera: Improve metadata access JNI performance" into rvc-dev

parents 803e933e d95058f1
Loading
Loading
Loading
Loading
+51 −34
Original line number Diff line number Diff line
@@ -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;
@@ -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");
        }
@@ -398,7 +400,7 @@ public class CameraMetadataNative implements Parcelable {

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        nativeWriteToParcel(dest);
        nativeWriteToParcel(dest, mMetadataPtr);
    }

    /**
@@ -440,7 +442,7 @@ public class CameraMetadataNative implements Parcelable {
    }

    public void readFromParcel(Parcel in) {
        nativeReadFromParcel(in);
        nativeReadFromParcel(in, mMetadataPtr);
    }

    /**
@@ -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) {
@@ -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);
@@ -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);
@@ -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) {
@@ -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);

@@ -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;

@@ -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;
@@ -1733,7 +1750,7 @@ public class CameraMetadataNative implements Parcelable {
     * @hide
     */
    public int getEntryCount() {
        return nativeGetEntryCount();
        return nativeGetEntryCount(mMetadataPtr);
    }

    /**
@@ -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
     */
@@ -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);
    }

    /**
@@ -1816,7 +1833,7 @@ public class CameraMetadataNative implements Parcelable {
     * @hide
     */
    public void writeValues(int tag, byte[] src) {
        nativeWriteValues(tag, src);
        nativeWriteValues(tag, src, mMetadataPtr);
    }

    /**
@@ -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);
    }

    /**
@@ -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);
        }
+70 −82
Original line number Diff line number Diff line
@@ -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;
    }
@@ -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;

@@ -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",
@@ -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.

@@ -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();
@@ -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();
@@ -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;
    }
@@ -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;
    }
@@ -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;
    }
@@ -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 },
};

@@ -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();
@@ -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) {
@@ -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()) {
@@ -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();
@@ -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();
@@ -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();
@@ -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",
@@ -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);