|
10 | 10 |
|
11 | 11 | jobject v8ToJava_javaObject(JNIEnv* env, v8::Local<v8::Object> obj); |
12 | 12 | jobject v8ToJava_javaLong(JNIEnv* env, v8::Local<v8::Object> obj); |
| 13 | +jobject v8ToJava_v8Object(JNIEnv* env, v8::Local<v8::Object> obj); |
13 | 14 |
|
14 | 15 | void javaReflectionGetMethods(JNIEnv *env, jclass clazz, std::list<jobject>* methods, bool includeStatic) { |
15 | 16 | jclass clazzclazz = env->FindClass("java/lang/Class"); |
@@ -362,14 +363,26 @@ jobject v8ToJava(JNIEnv* env, v8::Local<v8::Value> arg) { |
362 | 363 | if(!isJavaLong.IsEmpty() && isJavaLong->IsBoolean()) { |
363 | 364 | return v8ToJava_javaLong(env, obj); |
364 | 365 | } |
| 366 | + |
| 367 | + return v8ToJava_v8Object(env, obj); |
365 | 368 | } |
366 | 369 |
|
367 | 370 | // TODO: handle other arg types. Don't print here, see instanceof-test#non-java object |
368 | | - // v8::String::AsciiValue typeStr(arg); |
| 371 | + // v8::String::Utf8Value typeStr(arg); |
369 | 372 | // printf("v8ToJava: Unhandled type: %s\n", *typeStr); |
370 | 373 | return NULL; |
371 | 374 | } |
372 | 375 |
|
| 376 | +jobject v8ToJava_v8Object(JNIEnv* env, v8::Local<v8::Object> obj) { |
| 377 | + Nan::Persistent<v8::Object>* p = new Nan::Persistent<v8::Object>(); |
| 378 | + p->Reset(obj); |
| 379 | + |
| 380 | + jclass nodeObjectClass = env->FindClass("node/NodeObject"); |
| 381 | + jmethodID nodeObject_constructor = env->GetMethodID(nodeObjectClass, "<init>", "(J)V"); |
| 382 | + jobject jobj = env->NewObject(nodeObjectClass, nodeObject_constructor, (long) p); |
| 383 | + return jobj; |
| 384 | +} |
| 385 | + |
373 | 386 | jobject v8ToJava_javaObject(JNIEnv* env, v8::Local<v8::Object> obj) { |
374 | 387 | JavaObject* javaObject = Nan::ObjectWrap::Unwrap<JavaObject>(obj); |
375 | 388 | return javaObject->getObject(); |
@@ -644,11 +657,18 @@ v8::Local<v8::Value> javaToV8(Java* java, JNIEnv* env, jobject obj, DynamicProxy |
644 | 657 | } |
645 | 658 | case TYPE_STRING: |
646 | 659 | return Nan::New<v8::String>(javaObjectToString(env, obj).c_str()).ToLocalChecked(); |
647 | | - case TYPE_OBJECT: |
| 660 | + case TYPE_OBJECT: { |
648 | 661 | if (dynamicProxyData != NULL) { |
649 | 662 | return JavaProxyObject::New(java, obj, dynamicProxyData); |
650 | 663 | } |
| 664 | + jclass nodeObjectClass = env->FindClass("node/NodeObject"); |
| 665 | + if (env->IsSameObject(nodeObjectClass, objClazz)) { |
| 666 | + jmethodID nodeObjectClass_getHandle = env->GetMethodID(nodeObjectClass, "getHandle", "()J"); |
| 667 | + Nan::Persistent<v8::Object>* p = (Nan::Persistent<v8::Object>*) env->CallLongMethod(obj, nodeObjectClass_getHandle); |
| 668 | + return Nan::New(*p); |
| 669 | + } |
651 | 670 | return JavaObject::New(java, obj); |
| 671 | + } |
652 | 672 | default: |
653 | 673 | printf("javaToV8: unhandled type: 0x%03x\n", resultType); |
654 | 674 | return JavaObject::New(java, obj); |
|
0 commit comments