Skip to content

Commit

Permalink
feat(android): support converting byte[] to ArrayBuffer
Browse files Browse the repository at this point in the history
  • Loading branch information
sgtcoolguy committed Aug 13, 2020
1 parent e42bbcb commit 9e77600
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,18 @@ namespace ${ns?lower_case} {
"javaDeleteLocalRef":true,
"defaultValue": "null"
},
"byte[]":{
"jsType":"ArrayBuffer",
"jsHandleCast":"ArrayBuffer",
"jsToJavaConverter":"jsArrayBufferToJavaByteArray",
"javaToJsConverter":"javaByteArrayToJsArrayBuffer",
"jvalue":"l", "signature":"[B",
"javaCallMethodType":"Object",
"javaReturnType":"jbyteArray",
"javaValidation":true,
"javaDeleteLocalRef":true,
"defaultValue": "null"
},
"int[]":{
"jsType":"Array",
"jsHandleCast":"Array",
Expand Down
2 changes: 2 additions & 0 deletions android/runtime/v8/src/native/JNIUtil.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ jclass JNIUtil::doubleClass = NULL;
jclass JNIUtil::booleanClass = NULL;
jclass JNIUtil::stringArrayClass = NULL;
jclass JNIUtil::objectArrayClass = NULL;
jclass JNIUtil::byteArrayClass = NULL;
jclass JNIUtil::shortArrayClass = NULL;
jclass JNIUtil::intArrayClass = NULL;
jclass JNIUtil::longArrayClass = NULL;
Expand Down Expand Up @@ -312,6 +313,7 @@ void JNIUtil::initCache()
floatClass = findClass("java/lang/Float");
doubleClass = findClass("java/lang/Double");
booleanClass = findClass("java/lang/Boolean");
byteArrayClass = findClass("[B");
shortArrayClass = findClass("[S");
intArrayClass = findClass("[I");
longArrayClass = findClass("[J");
Expand Down
1 change: 1 addition & 0 deletions android/runtime/v8/src/native/JNIUtil.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ class JNIUtil
static jclass booleanClass;
static jclass stringArrayClass;
static jclass objectArrayClass;
static jclass byteArrayClass;
static jclass shortArrayClass;
static jclass intArrayClass;
static jclass longArrayClass;
Expand Down
25 changes: 25 additions & 0 deletions android/runtime/v8/src/native/TypeConverter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -540,6 +540,28 @@ Local<Array> TypeConverter::javaArrayToJsArray(Isolate* isolate, JNIEnv *env, ji
return jsArray;
}

Local<ArrayBuffer> TypeConverter::javaByteArrayToJsArrayBuffer(Isolate* isolate, jbyteArray javaByteArray)
{
JNIEnv *env = JNIScope::getEnv();
if (env == NULL) {
return Local<ArrayBuffer>();
}
return TypeConverter::javaByteArrayToJsArrayBuffer(isolate, env, javaByteArray);
}

Local<ArrayBuffer> TypeConverter::javaByteArrayToJsArrayBuffer(Isolate* isolate, JNIEnv *env, jbyteArray javaByteArray)
{
size_t byteCount = env->GetArrayLength(javaByteArray);
Local<ArrayBuffer> jsArray = ArrayBuffer::New(isolate, byteCount);
if (byteCount > 0) {
void* sourcePointer = (void*)(env->GetByteArrayElements(javaByteArray, 0));
void* destinationPointer = jsArray->GetContents().Data();
memcpy(destinationPointer, sourcePointer, byteCount);
env->ReleaseByteArrayElements(javaByteArray, reinterpret_cast<jbyte*>(sourcePointer), JNI_ABORT);
}
return jsArray;
}

jlongArray TypeConverter::jsArrayToJavaLongArray(Isolate* isolate, Local<Array> jsArray)
{
JNIEnv *env = JNIScope::getEnv();
Expand Down Expand Up @@ -1033,6 +1055,9 @@ Local<Value> TypeConverter::javaObjectToJsValue(Isolate* isolate, JNIEnv *env, j
} else if (env->IsInstanceOf(javaObject, JNIUtil::objectArrayClass)) {
return javaArrayToJsArray(isolate, (jobjectArray) javaObject);

} else if (env->IsInstanceOf(javaObject, JNIUtil::byteArrayClass)) {
return javaByteArrayToJsArrayBuffer(isolate, (jbyteArray) javaObject);

} else if (env->IsInstanceOf(javaObject, JNIUtil::shortArrayClass)) {
return javaArrayToJsArray(isolate, (jshortArray) javaObject);

Expand Down
2 changes: 2 additions & 0 deletions android/runtime/v8/src/native/TypeConverter.h
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@ class TypeConverter
static v8::Local<v8::Array> javaArrayToJsArray(v8::Isolate* isolate, jbooleanArray javaBooleanArray);
static jshortArray jsArrayToJavaShortArray(v8::Isolate* isolate, v8::Local<v8::Array> jsArray);
static v8::Local<v8::Array> javaArrayToJsArray(v8::Isolate* isolate, jshortArray javaShortArray);
static v8::Local<v8::ArrayBuffer> javaByteArrayToJsArrayBuffer(v8::Isolate* isolate, jbyteArray javaByteArray);
static jintArray jsArrayToJavaIntArray(v8::Isolate* isolate, v8::Local<v8::Array> jsArray);
static v8::Local<v8::Array> javaArrayToJsArray(v8::Isolate* isolate, jintArray javaIntArray);
static jlongArray jsArrayToJavaLongArray(v8::Isolate* isolate, v8::Local<v8::Array> jsArray);
Expand All @@ -154,6 +155,7 @@ class TypeConverter
static jarray jsArrayToJavaArray(v8::Isolate* isolate, JNIEnv *env, v8::Local<v8::Array> jsArray);
static jobjectArray jsArrayToJavaStringArray(v8::Isolate* isolate, JNIEnv *env, v8::Local<v8::Array> jsArray);
static v8::Local<v8::Array> javaArrayToJsArray(v8::Isolate* isolate, JNIEnv *env, jbooleanArray javaBooleanArray);
static v8::Local<v8::ArrayBuffer> javaByteArrayToJsArrayBuffer(v8::Isolate* isolate, JNIEnv *env, jbyteArray javaByteArray);
static jshortArray jsArrayToJavaShortArray(v8::Isolate* isolate, JNIEnv *env, v8::Local<v8::Array> jsArray);
static v8::Local<v8::Array> javaArrayToJsArray(v8::Isolate* isolate, JNIEnv *env, jshortArray javaShortArray);
static jintArray jsArrayToJavaIntArray(v8::Isolate* isolate, JNIEnv *env, v8::Local<v8::Array> jsArray);
Expand Down

0 comments on commit 9e77600

Please sign in to comment.