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

Commit 33569ca4 authored by Andreas Huber's avatar Andreas Huber Committed by android-build-merger
Browse files

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

am: a546c381

Change-Id: I969ec51ed8fc6c7e11e7cfe7c4e1a3d6aa5802de
parents 18a93665 a546c381
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -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();
+168 −6
Original line number Diff line number Diff line
@@ -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 },

+2 −0
Original line number Diff line number Diff line
@@ -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);