88
99#define MODIFIER_STATIC 9
1010
11+ jobject v8ToJava_javaObject (JNIEnv* env, v8::Local<v8::Object> obj);
12+ jobject v8ToJava_javaLong (JNIEnv* env, v8::Local<v8::Object> obj);
13+
1114void javaReflectionGetMethods (JNIEnv *env, jclass clazz, std::list<jobject>* methods, bool includeStatic) {
1215 jclass clazzclazz = env->FindClass (" java/lang/Class" );
1316 jmethodID clazz_getMethods = env->GetMethodID (clazzclazz, " getMethods" , " ()[Ljava/lang/reflect/Method;" );
@@ -267,55 +270,15 @@ jobject v8ToJava(JNIEnv* env, v8::Local<v8::Value> arg) {
267270
268271 if (arg->IsObject ()) {
269272 v8::Local<v8::Object> obj = v8::Object::Cast (*arg);
270- v8::Local<v8::Value> isJavaObject = obj->GetHiddenValue (v8::String::New (" __isJavaObject" ));
273+
274+ v8::Local<v8::Value> isJavaObject = obj->GetHiddenValue (v8::String::New (V8_HIDDEN_MARKER_JAVA_OBJECT ));
271275 if (!isJavaObject.IsEmpty () && isJavaObject->IsBoolean ()) {
272- JavaObject* javaObject = node::ObjectWrap::Unwrap<JavaObject>(obj);
273- jobject jobj = javaObject->getObject ();
274-
275- jclass nodeDynamicProxyClass = env->FindClass (" node/NodeDynamicProxyClass" );
276- if (env->IsInstanceOf (jobj, nodeDynamicProxyClass)) {
277- jfieldID ptrField = env->GetFieldID (nodeDynamicProxyClass, " ptr" , " J" );
278- DynamicProxyData* proxyData = (DynamicProxyData*)(long )env->GetLongField (jobj, ptrField);
279- if (!dynamicProxyDataVerify (proxyData)) {
280- return NULL ;
281- }
282-
283- jclass dynamicInterface = javaFindClass (env, proxyData->interfaceName );
284- if (dynamicInterface == NULL ) {
285- printf (" Could not find interface %s\n " , proxyData->interfaceName .c_str ());
286- return NULL ;
287- }
288- jclass classClazz = env->FindClass (" java/lang/Class" );
289- jobjectArray classArray = env->NewObjectArray (1 , classClazz, NULL );
290- env->SetObjectArrayElement (classArray, 0 , dynamicInterface);
291-
292- jmethodID class_getClassLoader = env->GetMethodID (classClazz, " getClassLoader" , " ()Ljava/lang/ClassLoader;" );
293- jobject classLoader = env->CallObjectMethod (dynamicInterface, class_getClassLoader);
294- if (classLoader == NULL ) {
295- jclass objectClazz = env->FindClass (" java/lang/Object" );
296- jmethodID object_getClass = env->GetMethodID (objectClazz, " getClass" , " ()Ljava/lang/Class;" );
297- jobject jobjClass = env->CallObjectMethod (jobj, object_getClass);
298- classLoader = env->CallObjectMethod (jobjClass, class_getClassLoader);
299- }
300-
301- jclass proxyClass = env->FindClass (" java/lang/reflect/Proxy" );
302- jmethodID proxy_newProxyInstance = env->GetStaticMethodID (proxyClass, " newProxyInstance" , " (Ljava/lang/ClassLoader;[Ljava/lang/Class;Ljava/lang/reflect/InvocationHandler;)Ljava/lang/Object;" );
303- if (classLoader == NULL ) {
304- printf (" Could not get classloader for Proxy\n " );
305- return NULL ;
306- }
307- if (classArray == NULL ) {
308- printf (" Could not create class array for Proxy\n " );
309- return NULL ;
310- }
311- if (jobj == NULL ) {
312- printf (" Not a valid object to wrap\n " );
313- return NULL ;
314- }
315- jobj = env->CallStaticObjectMethod (proxyClass, proxy_newProxyInstance, classLoader, classArray, jobj);
316- }
276+ return v8ToJava_javaObject (env, obj);
277+ }
317278
318- return jobj;
279+ v8::Local<v8::Value> isJavaLong = obj->GetHiddenValue (v8::String::New (V8_HIDDEN_MARKER_JAVA_LONG ));
280+ if (!isJavaLong.IsEmpty () && isJavaLong->IsBoolean ()) {
281+ return v8ToJava_javaLong (env, obj);
319282 }
320283 }
321284
@@ -325,6 +288,64 @@ jobject v8ToJava(JNIEnv* env, v8::Local<v8::Value> arg) {
325288 return NULL ;
326289}
327290
291+ jobject v8ToJava_javaObject (JNIEnv* env, v8::Local<v8::Object> obj) {
292+ JavaObject* javaObject = node::ObjectWrap::Unwrap<JavaObject>(obj);
293+ jobject jobj = javaObject->getObject ();
294+
295+ jclass nodeDynamicProxyClass = env->FindClass (" node/NodeDynamicProxyClass" );
296+ if (env->IsInstanceOf (jobj, nodeDynamicProxyClass)) {
297+ jfieldID ptrField = env->GetFieldID (nodeDynamicProxyClass, " ptr" , " J" );
298+ DynamicProxyData* proxyData = (DynamicProxyData*)(long )env->GetLongField (jobj, ptrField);
299+ if (!dynamicProxyDataVerify (proxyData)) {
300+ return NULL ;
301+ }
302+
303+ jclass dynamicInterface = javaFindClass (env, proxyData->interfaceName );
304+ if (dynamicInterface == NULL ) {
305+ printf (" Could not find interface %s\n " , proxyData->interfaceName .c_str ());
306+ return NULL ;
307+ }
308+ jclass classClazz = env->FindClass (" java/lang/Class" );
309+ jobjectArray classArray = env->NewObjectArray (1 , classClazz, NULL );
310+ env->SetObjectArrayElement (classArray, 0 , dynamicInterface);
311+
312+ jmethodID class_getClassLoader = env->GetMethodID (classClazz, " getClassLoader" , " ()Ljava/lang/ClassLoader;" );
313+ jobject classLoader = env->CallObjectMethod (dynamicInterface, class_getClassLoader);
314+ if (classLoader == NULL ) {
315+ jclass objectClazz = env->FindClass (" java/lang/Object" );
316+ jmethodID object_getClass = env->GetMethodID (objectClazz, " getClass" , " ()Ljava/lang/Class;" );
317+ jobject jobjClass = env->CallObjectMethod (jobj, object_getClass);
318+ classLoader = env->CallObjectMethod (jobjClass, class_getClassLoader);
319+ }
320+
321+ jclass proxyClass = env->FindClass (" java/lang/reflect/Proxy" );
322+ jmethodID proxy_newProxyInstance = env->GetStaticMethodID (proxyClass, " newProxyInstance" , " (Ljava/lang/ClassLoader;[Ljava/lang/Class;Ljava/lang/reflect/InvocationHandler;)Ljava/lang/Object;" );
323+ if (classLoader == NULL ) {
324+ printf (" Could not get classloader for Proxy\n " );
325+ return NULL ;
326+ }
327+ if (classArray == NULL ) {
328+ printf (" Could not create class array for Proxy\n " );
329+ return NULL ;
330+ }
331+ if (jobj == NULL ) {
332+ printf (" Not a valid object to wrap\n " );
333+ return NULL ;
334+ }
335+ jobj = env->CallStaticObjectMethod (proxyClass, proxy_newProxyInstance, classLoader, classArray, jobj);
336+ }
337+
338+ return jobj;
339+ }
340+
341+ jobject v8ToJava_javaLong (JNIEnv* env, v8::Local<v8::Object> obj) {
342+ jobject longValue = v8ToJava (env, obj->Get (v8::String::New (" longValue" )));
343+ jclass longClazz = env->FindClass (" java/lang/Long" );
344+ jmethodID long_constructor = env->GetMethodID (longClazz, " <init>" , " (Ljava/lang/String;)V" );
345+ jobject jobj = env->NewObject (longClazz, long_constructor, longValue);
346+ return jobj;
347+ }
348+
328349jobjectArray v8ToJava (JNIEnv* env, const v8::Arguments& args, int start, int end) {
329350 jclass clazz = env->FindClass (" java/lang/Object" );
330351 jobjectArray results = env->NewObjectArray (end-start, clazz, NULL );
@@ -509,14 +530,18 @@ v8::Handle<v8::Value> javaToV8(Java* java, JNIEnv* env, jobject obj) {
509530 jbyte result = env->CallByteMethod (obj, byte_byteValue);
510531 return scope.Close (v8::Number::New (result));
511532 }
512- // Removed to support long return types and long parameters.
513- // case TYPE_LONG:
514- // {
515- // jclass longClazz = env->FindClass("java/lang/Long");
516- // jmethodID long_longValue = env->GetMethodID(longClazz, "longValue", "()J");
517- // jlong result = env->CallLongMethod(obj, long_longValue);
518- // return scope.Close(v8::Number::New(result));
519- // }
533+ case TYPE_LONG :
534+ {
535+ jclass longClazz = env->FindClass (" java/lang/Long" );
536+ jmethodID long_longValue = env->GetMethodID (longClazz, " longValue" , " ()J" );
537+ jlong result = env->CallLongMethod (obj, long_longValue);
538+ std::string strValue = javaObjectToString (env, obj);
539+ v8::Local<v8::Value> v8Result = v8::NumberObject::New (result);
540+ v8::NumberObject* v8ResultNumberObject = v8::NumberObject::Cast (*v8Result);
541+ v8ResultNumberObject->Set (v8::String::New (" longValue" ), v8::String::New (strValue.c_str ()));
542+ v8ResultNumberObject->SetHiddenValue (v8::String::New (V8_HIDDEN_MARKER_JAVA_LONG ), v8::Boolean::New (true ));
543+ return scope.Close (v8Result);
544+ }
520545 case TYPE_INT :
521546 {
522547 jclass integerClazz = env->FindClass (" java/lang/Integer" );
0 commit comments