33#include " java.h"
44#include " javaObject.h"
55
6- MethodCallBaton::MethodCallBaton (Java* java, jobject method, std::list<jobject> args, v8::Handle<v8::Value> & callback) {
6+ MethodCallBaton::MethodCallBaton (Java* java, jobject method, std::list<jobject>& args, v8::Handle<v8::Value>& callback) {
77 JNIEnv *env = java->getJavaEnv ();
88
99 m_java = java;
@@ -29,6 +29,12 @@ void MethodCallBaton::run() {
2929 ev_ref (EV_DEFAULT_UC);
3030}
3131
32+ v8::Handle<v8::Value> MethodCallBaton::runSync () {
33+ JNIEnv *env = m_java->getJavaEnv ();
34+ execute (env);
35+ return resultsToV8 (env);
36+ }
37+
3238/* static*/ void MethodCallBaton::EIO_MethodCall (eio_req* req) {
3339 MethodCallBaton* self = static_cast <MethodCallBaton*>(req->data );
3440 JNIEnv *env = javaAttachCurrentThread (self->m_java ->getJvm ());
@@ -49,28 +55,30 @@ void MethodCallBaton::after(JNIEnv *env) {
4955 if (m_callback->IsFunction ()) {
5056 v8::Handle<v8::Value> argv[2 ];
5157 argv[0 ] = v8::Undefined ();
52- switch (m_resultType) {
53- case TYPE_INT:
54- {
55- jclass integerClazz = env->FindClass (" java/lang/Integer" );
56- jmethodID integer_intValue = env->GetMethodID (integerClazz, " intValue" , " ()I" );
57- int result = env->CallIntMethod (m_result, integer_intValue);
58- argv[1 ] = v8::Integer::New (result);
59- }
60- break ;
61- case TYPE_OBJECT:
62- argv[1 ] = JavaObject::New (m_java, m_result);
63- break ;
64- case TYPE_STRING:
65- argv[1 ] = v8::String::New (javaObjectToString (env, m_result).c_str ());
66- break ;
67- }
58+ argv[1 ] = resultsToV8 (env);
6859 v8::Function::Cast (*m_callback)->Call (v8::Context::GetCurrent ()->Global (), 2 , argv);
6960 }
7061
7162 env->DeleteGlobalRef (m_result);
7263}
7364
65+ v8::Handle<v8::Value> MethodCallBaton::resultsToV8 (JNIEnv *env) {
66+ switch (m_resultType) {
67+ case TYPE_INT:
68+ {
69+ jclass integerClazz = env->FindClass (" java/lang/Integer" );
70+ jmethodID integer_intValue = env->GetMethodID (integerClazz, " intValue" , " ()I" );
71+ int result = env->CallIntMethod (m_result, integer_intValue);
72+ return v8::Integer::New (result);
73+ }
74+ case TYPE_OBJECT:
75+ return JavaObject::New (m_java, m_result);
76+ case TYPE_STRING:
77+ return v8::String::New (javaObjectToString (env, m_result).c_str ());
78+ }
79+ return v8::Undefined ();
80+ }
81+
7482void NewInstanceBaton::execute (JNIEnv *env) {
7583 jclass constructorClazz = env->FindClass (" java/lang/reflect/Constructor" );
7684 jmethodID constructor_newInstance = env->GetMethodID (constructorClazz, " newInstance" , " ([Ljava/lang/Object;)Ljava/lang/Object;" );
@@ -108,8 +116,8 @@ NewInstanceBaton::NewInstanceBaton(
108116 Java* java,
109117 jclass clazz,
110118 jobject method,
111- std::list<jobject> args,
112- v8::Handle<v8::Value> & callback) : MethodCallBaton(java, method, args, callback) {
119+ std::list<jobject>& args,
120+ v8::Handle<v8::Value>& callback) : MethodCallBaton(java, method, args, callback) {
113121 JNIEnv *env = m_java->getJavaEnv ();
114122 m_clazz = (jclass)env->NewGlobalRef (clazz);
115123}
@@ -123,8 +131,8 @@ InstanceMethodCallBaton::InstanceMethodCallBaton(
123131 Java* java,
124132 JavaObject* obj,
125133 jobject method,
126- std::list<jobject> args,
127- v8::Handle<v8::Value> & callback) : MethodCallBaton(java, method, args, callback) {
134+ std::list<jobject>& args,
135+ v8::Handle<v8::Value>& callback) : MethodCallBaton(java, method, args, callback) {
128136 m_javaObject = obj;
129137 m_javaObject->Ref ();
130138}
0 commit comments