44#include " javaObject.h"
55
66MethodCallBaton::MethodCallBaton (Java* java, JavaObject* obj, jobject method, std::list<jobject> args, v8::Handle<v8::Value> &callback) {
7+ JNIEnv *env = java->getJavaEnv ();
8+
79 m_java = java;
810 m_javaObject = obj;
9- m_method = method;
10- m_args = args;
11+ m_method = env->NewGlobalRef (method);
12+ for (std::list<jobject>::iterator it = args.begin (); it != args.end (); it++) {
13+ m_args.push_back (env->NewGlobalRef (*it));
14+ }
1115 m_callback = v8::Persistent<v8::Value>::New (callback);
1216 m_javaObject->Ref ();
1317}
1418
1519MethodCallBaton::~MethodCallBaton () {
20+ JNIEnv *env = m_java->getJavaEnv ();
21+ env->DeleteGlobalRef (m_method);
22+ for (std::list<jobject>::iterator it = m_args.begin (); it != m_args.end (); it++) {
23+ env->DeleteGlobalRef (*it);
24+ }
25+
1626 m_callback.Dispose ();
1727 m_javaObject->Unref ();
1828}
@@ -30,18 +40,8 @@ MethodCallBaton::~MethodCallBaton() {
3040 jclass objectClazz = env->FindClass (" java/lang/Object" );
3141 jobjectArray parameters = env->NewObjectArray (0 , objectClazz, NULL ); // TODO: init parameters
3242 self->m_resultType = javaGetType (env, returnType);
33- switch (self->m_resultType ) {
34- case TYPE_INT :
35- printf (" m_method: %s\n " , javaObjectToString (env, self->m_method ).c_str ());
36- printf (" obj: %s\n " , javaObjectToString (env, self->m_javaObject ->m_obj ).c_str ());
37- printf (" parameters: %s\n " , javaObjectToString (env, parameters).c_str ());
38- self->m_result .i = env->CallIntMethod (self->m_method , method_invoke, self->m_javaObject ->m_obj , parameters);
39- printf (" %d\n " , self->m_result .i );
40- break ;
41- case TYPE_OBJECT :
42- self->m_result .l = env->CallObjectMethod (self->m_method , method_invoke, self->m_javaObject ->m_obj , parameters);
43- break ;
44- }
43+ jobject result = env->CallObjectMethod (self->m_method , method_invoke, self->m_javaObject ->m_obj , parameters);
44+ self->m_result = env->NewGlobalRef (result);
4545 if (env->ExceptionCheck ()) {
4646 env->ExceptionDescribe (); // TODO: handle error
4747 return ;
@@ -52,21 +52,31 @@ MethodCallBaton::~MethodCallBaton() {
5252
5353/* static*/ int MethodCallBaton::EIO_AfterMethodCall (eio_req* req) {
5454 MethodCallBaton* self = static_cast <MethodCallBaton*>(req->data );
55-
55+ JNIEnv *env = self->m_java ->getJavaEnv ();
56+
5657 if (self->m_callback ->IsFunction ()) {
5758 v8::Handle<v8::Value> argv[2 ];
5859 argv[0 ] = v8::Undefined ();
5960 switch (self->m_resultType ) {
6061 case TYPE_INT :
61- argv[1 ] = v8::Integer::New (self->m_result .i );
62+ {
63+ jclass integerClazz = env->FindClass (" java/lang/Integer" );
64+ jmethodID integer_intValue = env->GetMethodID (integerClazz, " intValue" , " ()I" );
65+ int result = env->CallIntMethod (self->m_result , integer_intValue);
66+ argv[1 ] = v8::Integer::New (result);
67+ }
6268 break ;
6369 case TYPE_OBJECT :
64- argv[1 ] = JavaObject::New (self->m_java , self->m_result .l );
70+ argv[1 ] = JavaObject::New (self->m_java , self->m_result );
71+ break ;
72+ case TYPE_STRING :
73+ argv[1 ] = v8::String::New (javaObjectToString (env, self->m_result ).c_str ());
6574 break ;
6675 }
6776 v8::Function::Cast (*self->m_callback )->Call (v8::Context::GetCurrent ()->Global (), 2 , argv);
6877 }
6978
79+ env->DeleteGlobalRef (self->m_result );
7080 ev_unref (EV_DEFAULT_UC );
7181 delete self;
7282 return 0 ;
0 commit comments