Camera: Improve metadata access JNI performance
- Don't use reverse-JNI to access metadata ptr, pass it as an arg instead - Use @FastNative since the calls are short and bounded in time Performance improvement: - On a 10-second trace of camera app running on sargo, percentage of time used in CameraMetadataNative.get went from 4.36% to 3.77%, a 15% reduction in time. Test: atest CtsCameraTestCases Bug: 150214459 Change-Id: I28d9428beaa7eada6292e24fe6ca1dbd9c2ff153
This commit is contained in:
@@ -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
|
||||
@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
|
||||
|
||||
private native synchronized ArrayList nativeGetAllVendorKeys(Class keyClass);
|
||||
@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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
static std::shared_ptr<CameraMetadata>* CameraMetadata_getSharedPtr(jlong metadataLongPtr) {
|
||||
return reinterpret_cast<std::shared_ptr<CameraMetadata>* >(metadataLongPtr);
|
||||
}
|
||||
|
||||
// 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;
|
||||
}
|
||||
auto metadata = reinterpret_cast<std::shared_ptr<CameraMetadata> *>(
|
||||
env->GetLongField(thiz, fields.metadata_ptr));
|
||||
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));
|
||||
if (metadata != nullptr) {
|
||||
delete metadata;
|
||||
env->SetLongField(thiz, fields.metadata_ptr, 0);
|
||||
}
|
||||
auto metadata = CameraMetadata_getSharedPtr(ptr);
|
||||
if (metadata != nullptr) {
|
||||
delete metadata;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
Reference in New Issue
Block a user