@@ -477,6 +477,14 @@ jvalueType javaGetArrayComponentType(JNIEnv *env, jobjectArray array) {
477477 return arrayComponentType;
478478}
479479
480+ #if (NODE_VERSION_AT_LEAST(4, 0, 0))
481+ v8::Local<v8::ArrayBuffer> newArrayBuffer (void * elems, size_t length) {
482+ v8::Local<v8::ArrayBuffer> ab = v8::ArrayBuffer::New (v8::Isolate::GetCurrent (), length);
483+ memcpy (ab->GetContents ().Data (), elems, length);
484+ return ab;
485+ }
486+ #endif
487+
480488v8::Local<v8::String> javaCharToV8String (jchar c) {
481489#if ((NODE_MAJOR_VERSION == 0) && (NODE_MINOR_VERSION <= 10))
482490 return v8::String::New (&c, 1 );
@@ -499,76 +507,126 @@ v8::Local<v8::Value> javaArrayToV8(Java* java, JNIEnv* env, jobjectArray objArra
499507 // printf("array size: %d\n", arraySize);
500508
501509 v8::Local<v8::Array> result = Nan::New<v8::Array>(arraySize);
510+ // http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html
502511 switch (arrayComponentType) {
503512 case TYPE_CHAR:
504513 {
505514 jchar* elems = env->GetCharArrayElements ((jcharArray)objArray, 0 );
515+ #if (NODE_VERSION_AT_LEAST(4, 0, 0))
516+ size_t byteLength = arraySize * 2 ;
517+ v8::Local<v8::ArrayBuffer> ab = newArrayBuffer (elems, byteLength);
518+ env->ReleaseCharArrayElements ((jcharArray)objArray, elems, 0 );
519+ return v8::Uint16Array::New (ab, 0 , arraySize);
520+ #else
506521 jchar str;
507522 for (jsize i=0 ; i<arraySize; i++) {
508523 str = elems[i];
509524 result->Set (i, javaCharToV8String (str));
510525 }
511526 env->ReleaseCharArrayElements ((jcharArray)objArray, elems, 0 );
527+ #endif
512528 }
513529 break ;
514530
515531 case TYPE_INT:
516532 {
517533 jint* elems = env->GetIntArrayElements ((jintArray)objArray, 0 );
534+ #if (NODE_VERSION_AT_LEAST(4, 0, 0))
535+ size_t byteLength = arraySize * 4 ;
536+ v8::Local<v8::ArrayBuffer> ab = newArrayBuffer (elems, byteLength);
537+ env->ReleaseIntArrayElements ((jintArray)objArray, elems, 0 );
538+ return v8::Int32Array::New (ab, 0 , arraySize);
539+ #else
518540 for (jsize i=0 ; i<arraySize; i++) {
519541 result->Set (i, Nan::New<v8::Integer>(elems[i]));
520542 }
521543 env->ReleaseIntArrayElements ((jintArray)objArray, elems, 0 );
544+ #endif
522545 }
523546 break ;
524547
525548 case TYPE_BYTE:
526549 {
527550 jbyte* elems = env->GetByteArrayElements ((jbyteArray)objArray, 0 );
551+ #if (NODE_VERSION_AT_LEAST(4, 0, 0))
552+ size_t byteLength = arraySize;
553+ v8::Local<v8::ArrayBuffer> ab = newArrayBuffer (elems, byteLength);
554+ env->ReleaseByteArrayElements ((jbyteArray)objArray, elems, 0 );
555+ return v8::Int8Array::New (ab, 0 , arraySize);
556+ #else
528557 for (jsize i=0 ; i<arraySize; i++) {
529558 result->Set (i, Nan::New<v8::Number>(elems[i]));
530559 }
531560 env->ReleaseByteArrayElements ((jbyteArray)objArray, elems, 0 );
561+ #endif
532562 }
533563 break ;
534564
535565 case TYPE_BOOLEAN:
536566 {
537567 jboolean* elems = env->GetBooleanArrayElements ((jbooleanArray)objArray, 0 );
568+ #if (NODE_VERSION_AT_LEAST(4, 0, 0))
569+ size_t byteLength = arraySize;
570+ v8::Local<v8::ArrayBuffer> ab = newArrayBuffer (elems, byteLength);
571+ env->ReleaseBooleanArrayElements ((jbooleanArray)objArray, elems, 0 );
572+ return v8::Uint8Array::New (ab, 0 , arraySize);
573+ #else
538574 for (jsize i=0 ; i<arraySize; i++) {
539575 result->Set (i, Nan::New<v8::Boolean>(elems[i]));
540576 }
541577 env->ReleaseBooleanArrayElements ((jbooleanArray)objArray, elems, 0 );
578+ #endif
542579 }
543580 break ;
544581
545582 case TYPE_SHORT:
546583 {
547584 jshort* elems = env->GetShortArrayElements ((jshortArray)objArray, 0 );
585+ #if (NODE_VERSION_AT_LEAST(4, 0, 0))
586+ size_t byteLength = arraySize * 2 ;
587+ v8::Local<v8::ArrayBuffer> ab = newArrayBuffer (elems, byteLength);
588+ env->ReleaseShortArrayElements ((jshortArray)objArray, elems, 0 );
589+ return v8::Int16Array::New (ab, 0 , arraySize);
590+ #else
548591 for (jsize i=0 ; i<arraySize; i++) {
549592 result->Set (i, Nan::New<v8::Number>(elems[i]));
550593 }
551594 env->ReleaseShortArrayElements ((jshortArray)objArray, elems, 0 );
595+ #endif
552596 }
553597 break ;
554598
555599 case TYPE_DOUBLE:
556600 {
557601 jdouble* elems = env->GetDoubleArrayElements ((jdoubleArray)objArray, 0 );
602+ #if (NODE_VERSION_AT_LEAST(4, 0, 0))
603+ size_t byteLength = arraySize * 8 ;
604+ v8::Local<v8::ArrayBuffer> ab = newArrayBuffer (elems, byteLength);
605+ env->ReleaseDoubleArrayElements ((jdoubleArray)objArray, elems, 0 );
606+ return v8::Float64Array::New (ab, 0 , arraySize);
607+ #else
558608 for (jsize i=0 ; i<arraySize; i++) {
559609 result->Set (i, Nan::New<v8::Number>(elems[i]));
560610 }
561611 env->ReleaseDoubleArrayElements ((jdoubleArray)objArray, elems, 0 );
612+ #endif
562613 }
563614 break ;
564615
565616 case TYPE_FLOAT:
566617 {
567618 jfloat* elems = env->GetFloatArrayElements ((jfloatArray)objArray, 0 );
619+ #if (NODE_VERSION_AT_LEAST(4, 0, 0))
620+ size_t byteLength = arraySize * 4 ;
621+ v8::Local<v8::ArrayBuffer> ab = newArrayBuffer (elems, byteLength);
622+ env->ReleaseFloatArrayElements ((jfloatArray)objArray, elems, 0 );
623+ return v8::Float32Array::New (ab, 0 , arraySize);
624+ #else
568625 for (jsize i=0 ; i<arraySize; i++) {
569626 result->Set (i, Nan::New<v8::Number>(elems[i]));
570627 }
571628 env->ReleaseFloatArrayElements ((jfloatArray)objArray, elems, 0 );
629+ #endif
572630 }
573631 break ;
574632
0 commit comments