Merge "Adds APIs to extract/import arrays of primitive Java types out of/into a HwBlob."

This commit is contained in:
Treehugger Robot
2017-10-31 22:59:34 +00:00
committed by Gerrit Code Review
3 changed files with 190 additions and 6 deletions

View File

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

View File

@@ -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());
@@ -150,6 +150,10 @@ const void *JHwBlob::data() const {
return mBuffer;
}
void *JHwBlob::data() {
return mBuffer;
}
size_t JHwBlob::size() const {
return mSize;
}
@@ -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 */);
}
}
@@ -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) { \
@@ -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) {
@@ -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 },
@@ -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 },

View File

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