Loading core/java/android/os/HwBlob.java +20 −0 Original line number Diff line number Diff line Loading @@ -43,6 +43,18 @@ public class HwBlob { public native final double getDouble(long offset); public native final String getString(long offset); /** The copyTo... methods copy the blob's data, starting from the given byte offset, into the array. A total of "size" _elements_ are copied. */ public native final void copyToBoolArray(long offset, boolean[] array, int size); public native final void copyToInt8Array(long offset, byte[] array, int size); public native final void copyToInt16Array(long offset, short[] array, int size); public native final void copyToInt32Array(long offset, int[] array, int size); public native final void copyToInt64Array(long offset, long[] array, int size); public native final void copyToFloatArray(long offset, float[] array, int size); public native final void copyToDoubleArray(long offset, double[] array, int size); public native final void putBool(long offset, boolean x); public native final void putInt8(long offset, byte x); public native final void putInt16(long offset, short x); Loading @@ -52,6 +64,14 @@ public class HwBlob { public native final void putDouble(long offset, double x); public native final void putString(long offset, String x); public native final void putBoolArray(long offset, boolean[] x); public native final void putInt8Array(long offset, byte[] x); public native final void putInt16Array(long offset, short[] x); public native final void putInt32Array(long offset, int[] x); public native final void putInt64Array(long offset, long[] x); public native final void putFloatArray(long offset, float[] x); public native final void putDoubleArray(long offset, double[] x); public native final void putBlob(long offset, HwBlob blob); public native final long handle(); Loading core/jni/android_os_HwBlob.cpp +168 −6 Original line number Diff line number Diff line Loading @@ -60,12 +60,12 @@ sp<JHwBlob> JHwBlob::SetNativeContext( JNIEnv *env, jobject thiz, const sp<JHwBlob> &context) { sp<JHwBlob> old = (JHwBlob *)env->GetLongField(thiz, gFields.contextID); if (context != NULL) { context->incStrong(NULL /* id */); if (context != nullptr) { context->incStrong(nullptr /* id */); } if (old != NULL) { old->decStrong(NULL /* id */); if (old != nullptr) { old->decStrong(nullptr /* id */); } env->SetLongField(thiz, gFields.contextID, (long)context.get()); Loading Loading @@ -150,6 +150,10 @@ const void *JHwBlob::data() const { return mBuffer; } void *JHwBlob::data() { return mBuffer; } size_t JHwBlob::size() const { return mSize; } Loading Loading @@ -242,8 +246,8 @@ using namespace android; static void releaseNativeContext(void *nativeContext) { sp<JHwBlob> parcel = (JHwBlob *)nativeContext; if (parcel != NULL) { parcel->decStrong(NULL /* id */); if (parcel != nullptr) { parcel->decStrong(nullptr /* id */); } } Loading Loading @@ -313,6 +317,82 @@ static jstring JHwBlob_native_getString( return env->NewStringUTF(s->c_str()); } #define DEFINE_BLOB_ARRAY_COPIER(Suffix,Type,NewType) \ static void JHwBlob_native_copyTo ## Suffix ## Array( \ JNIEnv *env, \ jobject thiz, \ jlong offset, \ Type ## Array array, \ jint size) { \ if (array == nullptr) { \ jniThrowException(env, "java/lang/NullPointerException", nullptr); \ return; \ } \ \ if (env->GetArrayLength(array) < size) { \ signalExceptionForError(env, BAD_VALUE); \ return; \ } \ \ sp<JHwBlob> blob = JHwBlob::GetNativeContext(env, thiz); \ \ if ((offset + size * sizeof(Type)) > blob->size()) { \ signalExceptionForError(env, -ERANGE); \ return; \ } \ \ env->Set ## NewType ## ArrayRegion( \ array, \ 0 /* start */, \ size, \ reinterpret_cast<const Type *>( \ static_cast<const uint8_t *>(blob->data()) + offset)); \ } static void JHwBlob_native_copyToBoolArray( JNIEnv *env, jobject thiz, jlong offset, jbooleanArray array, jint size) { if (array == nullptr) { jniThrowException(env, "java/lang/NullPointerException", nullptr); return; } if (env->GetArrayLength(array) < size) { signalExceptionForError(env, BAD_VALUE); return; } sp<JHwBlob> blob = JHwBlob::GetNativeContext(env, thiz); if ((offset + size * sizeof(bool)) > blob->size()) { signalExceptionForError(env, -ERANGE); return; } const bool *src = reinterpret_cast<const bool *>( static_cast<const uint8_t *>(blob->data()) + offset); jboolean *dst = env->GetBooleanArrayElements(array, nullptr /* isCopy */); for (jint i = 0; i < size; ++i) { dst[i] = src[i]; } env->ReleaseBooleanArrayElements(array, dst, 0 /* mode */); dst = nullptr; } DEFINE_BLOB_ARRAY_COPIER(Int8,jbyte,Byte) DEFINE_BLOB_ARRAY_COPIER(Int16,jshort,Short) DEFINE_BLOB_ARRAY_COPIER(Int32,jint,Int) DEFINE_BLOB_ARRAY_COPIER(Int64,jlong,Long) DEFINE_BLOB_ARRAY_COPIER(Float,jfloat,Float) DEFINE_BLOB_ARRAY_COPIER(Double,jdouble,Double) #define DEFINE_BLOB_PUTTER(Suffix,Type) \ static void JHwBlob_native_put ## Suffix( \ JNIEnv *env, jobject thiz, jlong offset, Type x) { \ Loading Loading @@ -375,6 +455,72 @@ static void JHwBlob_native_putString( blob->putBlob(offset + hidl_string::kOffsetOfBuffer, subBlob); } #define DEFINE_BLOB_ARRAY_PUTTER(Suffix,Type,NewType) \ static void JHwBlob_native_put ## Suffix ## Array( \ JNIEnv *env, jobject thiz, jlong offset, Type ## Array array) { \ \ if (array == nullptr) { \ jniThrowException(env, "java/lang/NullPointerException", nullptr); \ return; \ } \ \ sp<JHwBlob> blob = JHwBlob::GetNativeContext(env, thiz); \ \ jsize len = env->GetArrayLength(array); \ \ Type *src = \ env->Get ## NewType ## ArrayElements(array, nullptr /* isCopy */); \ \ status_t err = blob->write(offset, src, len * sizeof(Type)); \ \ env->Release ## NewType ## ArrayElements(array, src, 0 /* mode */); \ src = nullptr; \ \ if (err != OK) { \ signalExceptionForError(env, err); \ } \ } DEFINE_BLOB_ARRAY_PUTTER(Int8,jbyte,Byte) DEFINE_BLOB_ARRAY_PUTTER(Int16,jshort,Short) DEFINE_BLOB_ARRAY_PUTTER(Int32,jint,Int) DEFINE_BLOB_ARRAY_PUTTER(Int64,jlong,Long) DEFINE_BLOB_ARRAY_PUTTER(Float,jfloat,Float) DEFINE_BLOB_ARRAY_PUTTER(Double,jdouble,Double) static void JHwBlob_native_putBoolArray( JNIEnv *env, jobject thiz, jlong offset, jbooleanArray array) { if (array == nullptr) { jniThrowException(env, "java/lang/NullPointerException", nullptr); return; } sp<JHwBlob> blob = JHwBlob::GetNativeContext(env, thiz); jsize len = env->GetArrayLength(array); if ((offset + len * sizeof(bool)) > blob->size()) { signalExceptionForError(env, -ERANGE); return; } const jboolean *src = env->GetBooleanArrayElements(array, nullptr /* isCopy */); bool *dst = reinterpret_cast<bool *>( static_cast<uint8_t *>(blob->data()) + offset); for (jsize i = 0; i < len; ++i) { dst[i] = src[i]; } env->ReleaseBooleanArrayElements( array, const_cast<jboolean *>(src), 0 /* mode */); src = nullptr; } static void JHwBlob_native_putBlob( JNIEnv *env, jobject thiz, jlong offset, jobject blobObj) { if (blobObj == nullptr) { Loading Loading @@ -413,6 +559,14 @@ static JNINativeMethod gMethods[] = { { "getDouble", "(J)D", (void *)JHwBlob_native_getDouble }, { "getString", "(J)Ljava/lang/String;", (void *)JHwBlob_native_getString }, { "copyToBoolArray", "(J[ZI)V", (void *)JHwBlob_native_copyToBoolArray }, { "copyToInt8Array", "(J[BI)V", (void *)JHwBlob_native_copyToInt8Array }, { "copyToInt16Array", "(J[SI)V", (void *)JHwBlob_native_copyToInt16Array }, { "copyToInt32Array", "(J[II)V", (void *)JHwBlob_native_copyToInt32Array }, { "copyToInt64Array", "(J[JI)V", (void *)JHwBlob_native_copyToInt64Array }, { "copyToFloatArray", "(J[FI)V", (void *)JHwBlob_native_copyToFloatArray }, { "copyToDoubleArray", "(J[DI)V", (void *)JHwBlob_native_copyToDoubleArray }, { "putBool", "(JZ)V", (void *)JHwBlob_native_putBool }, { "putInt8", "(JB)V", (void *)JHwBlob_native_putInt8 }, { "putInt16", "(JS)V", (void *)JHwBlob_native_putInt16 }, Loading @@ -422,6 +576,14 @@ static JNINativeMethod gMethods[] = { { "putDouble", "(JD)V", (void *)JHwBlob_native_putDouble }, { "putString", "(JLjava/lang/String;)V", (void *)JHwBlob_native_putString }, { "putBoolArray", "(J[Z)V", (void *)JHwBlob_native_putBoolArray }, { "putInt8Array", "(J[B)V", (void *)JHwBlob_native_putInt8Array }, { "putInt16Array", "(J[S)V", (void *)JHwBlob_native_putInt16Array }, { "putInt32Array", "(J[I)V", (void *)JHwBlob_native_putInt32Array }, { "putInt64Array", "(J[J)V", (void *)JHwBlob_native_putInt64Array }, { "putFloatArray", "(J[F)V", (void *)JHwBlob_native_putFloatArray }, { "putDoubleArray", "(J[D)V", (void *)JHwBlob_native_putDoubleArray }, { "putBlob", "(JL" PACKAGE_PATH "/HwBlob;)V", (void *)JHwBlob_native_putBlob }, Loading core/jni/android_os_HwBlob.h +2 −0 Original line number Diff line number Diff line Loading @@ -50,6 +50,8 @@ struct JHwBlob : public RefBase { size_t offset, const android::hardware::hidl_string **s) const; const void *data() const; void *data(); size_t size() const; status_t putBlob(size_t offset, const sp<JHwBlob> &blob); Loading Loading
core/java/android/os/HwBlob.java +20 −0 Original line number Diff line number Diff line Loading @@ -43,6 +43,18 @@ public class HwBlob { public native final double getDouble(long offset); public native final String getString(long offset); /** The copyTo... methods copy the blob's data, starting from the given byte offset, into the array. A total of "size" _elements_ are copied. */ public native final void copyToBoolArray(long offset, boolean[] array, int size); public native final void copyToInt8Array(long offset, byte[] array, int size); public native final void copyToInt16Array(long offset, short[] array, int size); public native final void copyToInt32Array(long offset, int[] array, int size); public native final void copyToInt64Array(long offset, long[] array, int size); public native final void copyToFloatArray(long offset, float[] array, int size); public native final void copyToDoubleArray(long offset, double[] array, int size); public native final void putBool(long offset, boolean x); public native final void putInt8(long offset, byte x); public native final void putInt16(long offset, short x); Loading @@ -52,6 +64,14 @@ public class HwBlob { public native final void putDouble(long offset, double x); public native final void putString(long offset, String x); public native final void putBoolArray(long offset, boolean[] x); public native final void putInt8Array(long offset, byte[] x); public native final void putInt16Array(long offset, short[] x); public native final void putInt32Array(long offset, int[] x); public native final void putInt64Array(long offset, long[] x); public native final void putFloatArray(long offset, float[] x); public native final void putDoubleArray(long offset, double[] x); public native final void putBlob(long offset, HwBlob blob); public native final long handle(); Loading
core/jni/android_os_HwBlob.cpp +168 −6 Original line number Diff line number Diff line Loading @@ -60,12 +60,12 @@ sp<JHwBlob> JHwBlob::SetNativeContext( JNIEnv *env, jobject thiz, const sp<JHwBlob> &context) { sp<JHwBlob> old = (JHwBlob *)env->GetLongField(thiz, gFields.contextID); if (context != NULL) { context->incStrong(NULL /* id */); if (context != nullptr) { context->incStrong(nullptr /* id */); } if (old != NULL) { old->decStrong(NULL /* id */); if (old != nullptr) { old->decStrong(nullptr /* id */); } env->SetLongField(thiz, gFields.contextID, (long)context.get()); Loading Loading @@ -150,6 +150,10 @@ const void *JHwBlob::data() const { return mBuffer; } void *JHwBlob::data() { return mBuffer; } size_t JHwBlob::size() const { return mSize; } Loading Loading @@ -242,8 +246,8 @@ using namespace android; static void releaseNativeContext(void *nativeContext) { sp<JHwBlob> parcel = (JHwBlob *)nativeContext; if (parcel != NULL) { parcel->decStrong(NULL /* id */); if (parcel != nullptr) { parcel->decStrong(nullptr /* id */); } } Loading Loading @@ -313,6 +317,82 @@ static jstring JHwBlob_native_getString( return env->NewStringUTF(s->c_str()); } #define DEFINE_BLOB_ARRAY_COPIER(Suffix,Type,NewType) \ static void JHwBlob_native_copyTo ## Suffix ## Array( \ JNIEnv *env, \ jobject thiz, \ jlong offset, \ Type ## Array array, \ jint size) { \ if (array == nullptr) { \ jniThrowException(env, "java/lang/NullPointerException", nullptr); \ return; \ } \ \ if (env->GetArrayLength(array) < size) { \ signalExceptionForError(env, BAD_VALUE); \ return; \ } \ \ sp<JHwBlob> blob = JHwBlob::GetNativeContext(env, thiz); \ \ if ((offset + size * sizeof(Type)) > blob->size()) { \ signalExceptionForError(env, -ERANGE); \ return; \ } \ \ env->Set ## NewType ## ArrayRegion( \ array, \ 0 /* start */, \ size, \ reinterpret_cast<const Type *>( \ static_cast<const uint8_t *>(blob->data()) + offset)); \ } static void JHwBlob_native_copyToBoolArray( JNIEnv *env, jobject thiz, jlong offset, jbooleanArray array, jint size) { if (array == nullptr) { jniThrowException(env, "java/lang/NullPointerException", nullptr); return; } if (env->GetArrayLength(array) < size) { signalExceptionForError(env, BAD_VALUE); return; } sp<JHwBlob> blob = JHwBlob::GetNativeContext(env, thiz); if ((offset + size * sizeof(bool)) > blob->size()) { signalExceptionForError(env, -ERANGE); return; } const bool *src = reinterpret_cast<const bool *>( static_cast<const uint8_t *>(blob->data()) + offset); jboolean *dst = env->GetBooleanArrayElements(array, nullptr /* isCopy */); for (jint i = 0; i < size; ++i) { dst[i] = src[i]; } env->ReleaseBooleanArrayElements(array, dst, 0 /* mode */); dst = nullptr; } DEFINE_BLOB_ARRAY_COPIER(Int8,jbyte,Byte) DEFINE_BLOB_ARRAY_COPIER(Int16,jshort,Short) DEFINE_BLOB_ARRAY_COPIER(Int32,jint,Int) DEFINE_BLOB_ARRAY_COPIER(Int64,jlong,Long) DEFINE_BLOB_ARRAY_COPIER(Float,jfloat,Float) DEFINE_BLOB_ARRAY_COPIER(Double,jdouble,Double) #define DEFINE_BLOB_PUTTER(Suffix,Type) \ static void JHwBlob_native_put ## Suffix( \ JNIEnv *env, jobject thiz, jlong offset, Type x) { \ Loading Loading @@ -375,6 +455,72 @@ static void JHwBlob_native_putString( blob->putBlob(offset + hidl_string::kOffsetOfBuffer, subBlob); } #define DEFINE_BLOB_ARRAY_PUTTER(Suffix,Type,NewType) \ static void JHwBlob_native_put ## Suffix ## Array( \ JNIEnv *env, jobject thiz, jlong offset, Type ## Array array) { \ \ if (array == nullptr) { \ jniThrowException(env, "java/lang/NullPointerException", nullptr); \ return; \ } \ \ sp<JHwBlob> blob = JHwBlob::GetNativeContext(env, thiz); \ \ jsize len = env->GetArrayLength(array); \ \ Type *src = \ env->Get ## NewType ## ArrayElements(array, nullptr /* isCopy */); \ \ status_t err = blob->write(offset, src, len * sizeof(Type)); \ \ env->Release ## NewType ## ArrayElements(array, src, 0 /* mode */); \ src = nullptr; \ \ if (err != OK) { \ signalExceptionForError(env, err); \ } \ } DEFINE_BLOB_ARRAY_PUTTER(Int8,jbyte,Byte) DEFINE_BLOB_ARRAY_PUTTER(Int16,jshort,Short) DEFINE_BLOB_ARRAY_PUTTER(Int32,jint,Int) DEFINE_BLOB_ARRAY_PUTTER(Int64,jlong,Long) DEFINE_BLOB_ARRAY_PUTTER(Float,jfloat,Float) DEFINE_BLOB_ARRAY_PUTTER(Double,jdouble,Double) static void JHwBlob_native_putBoolArray( JNIEnv *env, jobject thiz, jlong offset, jbooleanArray array) { if (array == nullptr) { jniThrowException(env, "java/lang/NullPointerException", nullptr); return; } sp<JHwBlob> blob = JHwBlob::GetNativeContext(env, thiz); jsize len = env->GetArrayLength(array); if ((offset + len * sizeof(bool)) > blob->size()) { signalExceptionForError(env, -ERANGE); return; } const jboolean *src = env->GetBooleanArrayElements(array, nullptr /* isCopy */); bool *dst = reinterpret_cast<bool *>( static_cast<uint8_t *>(blob->data()) + offset); for (jsize i = 0; i < len; ++i) { dst[i] = src[i]; } env->ReleaseBooleanArrayElements( array, const_cast<jboolean *>(src), 0 /* mode */); src = nullptr; } static void JHwBlob_native_putBlob( JNIEnv *env, jobject thiz, jlong offset, jobject blobObj) { if (blobObj == nullptr) { Loading Loading @@ -413,6 +559,14 @@ static JNINativeMethod gMethods[] = { { "getDouble", "(J)D", (void *)JHwBlob_native_getDouble }, { "getString", "(J)Ljava/lang/String;", (void *)JHwBlob_native_getString }, { "copyToBoolArray", "(J[ZI)V", (void *)JHwBlob_native_copyToBoolArray }, { "copyToInt8Array", "(J[BI)V", (void *)JHwBlob_native_copyToInt8Array }, { "copyToInt16Array", "(J[SI)V", (void *)JHwBlob_native_copyToInt16Array }, { "copyToInt32Array", "(J[II)V", (void *)JHwBlob_native_copyToInt32Array }, { "copyToInt64Array", "(J[JI)V", (void *)JHwBlob_native_copyToInt64Array }, { "copyToFloatArray", "(J[FI)V", (void *)JHwBlob_native_copyToFloatArray }, { "copyToDoubleArray", "(J[DI)V", (void *)JHwBlob_native_copyToDoubleArray }, { "putBool", "(JZ)V", (void *)JHwBlob_native_putBool }, { "putInt8", "(JB)V", (void *)JHwBlob_native_putInt8 }, { "putInt16", "(JS)V", (void *)JHwBlob_native_putInt16 }, Loading @@ -422,6 +576,14 @@ static JNINativeMethod gMethods[] = { { "putDouble", "(JD)V", (void *)JHwBlob_native_putDouble }, { "putString", "(JLjava/lang/String;)V", (void *)JHwBlob_native_putString }, { "putBoolArray", "(J[Z)V", (void *)JHwBlob_native_putBoolArray }, { "putInt8Array", "(J[B)V", (void *)JHwBlob_native_putInt8Array }, { "putInt16Array", "(J[S)V", (void *)JHwBlob_native_putInt16Array }, { "putInt32Array", "(J[I)V", (void *)JHwBlob_native_putInt32Array }, { "putInt64Array", "(J[J)V", (void *)JHwBlob_native_putInt64Array }, { "putFloatArray", "(J[F)V", (void *)JHwBlob_native_putFloatArray }, { "putDoubleArray", "(J[D)V", (void *)JHwBlob_native_putDoubleArray }, { "putBlob", "(JL" PACKAGE_PATH "/HwBlob;)V", (void *)JHwBlob_native_putBlob }, Loading
core/jni/android_os_HwBlob.h +2 −0 Original line number Diff line number Diff line Loading @@ -50,6 +50,8 @@ struct JHwBlob : public RefBase { size_t offset, const android::hardware::hidl_string **s) const; const void *data() const; void *data(); size_t size() const; status_t putBlob(size_t offset, const sp<JHwBlob> &blob); Loading