@@ -373,23 +373,103 @@ v8::Handle<v8::Value> javaExceptionToV8(JNIEnv* env, const std::string& alternat
373373 return scope.Close (javaExceptionToV8 (env, ex, alternateMessage));
374374}
375375
376+ jvalueType javaGetArrayComponentType (JNIEnv *env, jobjectArray array) {
377+ jclass objectClazz = env->FindClass (" java/lang/Object" );
378+ jclass clazzclazz = env->FindClass (" java/lang/Class" );
379+
380+ jmethodID object_getClass = env->GetMethodID (objectClazz, " getClass" , " ()Ljava/lang/Class;" );
381+ jobject arrayClass = env->CallObjectMethod (array, object_getClass);
382+
383+ jmethodID class_getComponentType = env->GetMethodID (clazzclazz, " getComponentType" , " ()Ljava/lang/Class;" );
384+ jobject arrayComponentTypeClass = env->CallObjectMethod (arrayClass, class_getComponentType);
385+
386+ jvalueType arrayComponentType = javaGetType (env, (jclass)arrayComponentTypeClass);
387+ return arrayComponentType;
388+ }
389+
376390v8::Handle<v8::Value> javaArrayToV8 (Java* java, JNIEnv* env, jobjectArray objArray) {
377391 v8::HandleScope scope;
378392
379393 if (objArray == NULL ) {
380394 return v8::Null ();
381395 }
382396
383- // printf("javaArrayToV8: %d %s\n", javaObjectToString(env, objArray).c_str());
397+ jvalueType arrayComponentType = javaGetArrayComponentType (env, objArray);
398+ // printf("javaArrayToV8: %d %s\n", arrayComponentType, javaObjectToString(env, objArray).c_str());
384399
385400 jsize arraySize = env->GetArrayLength (objArray);
386401 // printf("array size: %d\n", arraySize);
387402
388403 v8::Handle<v8::Array> result = v8::Array::New (arraySize);
389- for (jsize i=0 ; i<arraySize; i++) {
390- jobject obj = env->GetObjectArrayElement (objArray, i);
391- v8::Handle<v8::Value> item = javaToV8 (java, env, obj);
392- result->Set (i, item);
404+ switch (arrayComponentType) {
405+ case TYPE_INT:
406+ {
407+ jint* elems = env->GetIntArrayElements ((jintArray)objArray, 0 );
408+ for (jsize i=0 ; i<arraySize; i++) {
409+ result->Set (i, v8::Integer::New (elems[i]));
410+ }
411+ env->ReleaseIntArrayElements ((jintArray)objArray, elems, 0 );
412+ }
413+ break ;
414+
415+ case TYPE_BYTE:
416+ {
417+ jbyte* elems = env->GetByteArrayElements ((jbyteArray)objArray, 0 );
418+ for (jsize i=0 ; i<arraySize; i++) {
419+ result->Set (i, v8::Number::New (elems[i]));
420+ }
421+ env->ReleaseByteArrayElements ((jbyteArray)objArray, elems, 0 );
422+ }
423+ break ;
424+
425+ case TYPE_BOOLEAN:
426+ {
427+ jboolean* elems = env->GetBooleanArrayElements ((jbooleanArray)objArray, 0 );
428+ for (jsize i=0 ; i<arraySize; i++) {
429+ result->Set (i, v8::Boolean::New (elems[i]));
430+ }
431+ env->ReleaseBooleanArrayElements ((jbooleanArray)objArray, elems, 0 );
432+ }
433+ break ;
434+
435+ case TYPE_DOUBLE:
436+ {
437+ jdouble* elems = env->GetDoubleArrayElements ((jdoubleArray)objArray, 0 );
438+ for (jsize i=0 ; i<arraySize; i++) {
439+ result->Set (i, v8::Number::New (elems[i]));
440+ }
441+ env->ReleaseDoubleArrayElements ((jdoubleArray)objArray, elems, 0 );
442+ }
443+ break ;
444+
445+ case TYPE_FLOAT:
446+ {
447+ jfloat* elems = env->GetFloatArrayElements ((jfloatArray)objArray, 0 );
448+ for (jsize i=0 ; i<arraySize; i++) {
449+ result->Set (i, v8::Number::New (elems[i]));
450+ }
451+ env->ReleaseFloatArrayElements ((jfloatArray)objArray, elems, 0 );
452+ }
453+ break ;
454+
455+ case TYPE_LONG:
456+ {
457+ jlong* elems = env->GetLongArrayElements ((jlongArray)objArray, 0 );
458+ for (jsize i=0 ; i<arraySize; i++) {
459+ jobject obj = longToJavaLongObj (env, elems[i]);
460+ result->Set (i, JavaObject::New (java, obj));
461+ }
462+ env->ReleaseLongArrayElements ((jlongArray)objArray, elems, 0 );
463+ }
464+ break ;
465+
466+ default :
467+ for (jsize i=0 ; i<arraySize; i++) {
468+ jobject obj = env->GetObjectArrayElement (objArray, i);
469+ v8::Handle<v8::Value> item = javaToV8 (java, env, obj);
470+ result->Set (i, item);
471+ }
472+ break ;
393473 }
394474
395475 return scope.Close (result);
@@ -506,10 +586,11 @@ jobject javaFindConstructor(JNIEnv *env, jclass clazz, jobjectArray methodArgs)
506586 return method;
507587}
508588
509- jobject longToJavaLongObj (JNIEnv *env, long val) {
589+ jobject longToJavaLongObj (JNIEnv *env, jlong val) {
510590 jclass longClass = env->FindClass (" java/lang/Long" );
511591 jmethodID constructor = env->GetMethodID (longClass, " <init>" , " (J)V" );
512- return env->NewObject (longClass, constructor, val);
592+ jobject result = env->NewObject (longClass, constructor, val);
593+ return result;
513594}
514595
515596int dynamicProxyDataVerify (DynamicProxyData* data) {
0 commit comments