Skip to content

Commit 4bc56fc

Browse files
committed
handle boolean and void
1 parent 01777c0 commit 4bc56fc

4 files changed

Lines changed: 28 additions & 14 deletions

File tree

src/methodCallBaton.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
MethodCallBaton::MethodCallBaton(Java* java, jobject method, jarray args, v8::Handle<v8::Value>& callback) {
77
JNIEnv *env = java->getJavaEnv();
8-
8+
99
m_java = java;
1010
m_args = (jarray)env->NewGlobalRef(args);
1111
m_callback = v8::Persistent<v8::Value>::New(callback);
@@ -54,11 +54,20 @@ void MethodCallBaton::after(JNIEnv *env) {
5454
v8::Function::Cast(*m_callback)->Call(v8::Context::GetCurrent()->Global(), 2, argv);
5555
}
5656

57-
env->DeleteGlobalRef(m_result);
57+
env->DeleteGlobalRef(m_result);
5858
}
5959

6060
v8::Handle<v8::Value> MethodCallBaton::resultsToV8(JNIEnv *env) {
6161
switch(m_resultType) {
62+
case TYPE_VOID:
63+
return v8::Undefined();
64+
case TYPE_BOOLEAN:
65+
{
66+
jclass booleanClazz = env->FindClass("java/lang/Boolean");
67+
jmethodID boolean_booleanValue = env->GetMethodID(booleanClazz, "booleanValue", "()Z");
68+
bool result = env->CallBooleanMethod(m_result, boolean_booleanValue);
69+
return v8::Boolean::New(result);
70+
}
6271
case TYPE_INT:
6372
{
6473
jclass integerClazz = env->FindClass("java/lang/Integer");
@@ -84,7 +93,7 @@ void NewInstanceBaton::execute(JNIEnv *env) {
8493
if(env->ExceptionCheck()) {
8594
env->ExceptionDescribe(); // TODO: handle error
8695
return;
87-
}
96+
}
8897
}
8998

9099
void InstanceMethodCallBaton::execute(JNIEnv *env) {
@@ -100,7 +109,7 @@ void InstanceMethodCallBaton::execute(JNIEnv *env) {
100109
if(env->ExceptionCheck()) {
101110
env->ExceptionDescribe(); // TODO: handle error
102111
return;
103-
}
112+
}
104113
}
105114

106115
NewInstanceBaton::NewInstanceBaton(
@@ -131,4 +140,3 @@ InstanceMethodCallBaton::InstanceMethodCallBaton(
131140
InstanceMethodCallBaton::~InstanceMethodCallBaton() {
132141
m_javaObject->Unref();
133142
}
134-

src/utils.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ jobject javaFindBestMatchingConstructor(
8282

8383
for(std::list<jobject>::iterator it = constructors.begin(); it != constructors.end(); it++) {
8484
jarray parameters = (jarray)env->CallObjectMethod(*it, constructor_getParameterTypes);
85-
if(env->GetArrayLength(parameters) == (jsize)argTypes.size()) {
85+
if(env->GetArrayLength(parameters) == (jsize)argTypes.size()) {
8686
return *it; // TODO: check parameters
8787
}
8888
}
@@ -106,15 +106,18 @@ void javaDetachCurrentThread(JavaVM* jvm) {
106106
jvalueType javaGetType(JNIEnv *env, jclass type) {
107107
// TODO: has to be a better way
108108
const char *typeStr = javaObjectToString(env, type).c_str();
109+
//printf("%s\n", typeStr);
109110
if(strcmp(typeStr, "int") == 0) {
110111
return TYPE_INT;
112+
} else if(strcmp(typeStr, "void") == 0) {
113+
return TYPE_VOID;
114+
} else if(strcmp(typeStr, "boolean") == 0) {
115+
return TYPE_BOOLEAN;
111116
} else if(strcmp(typeStr, "class java.lang.String") == 0) {
112117
return TYPE_STRING;
113118
}
114-
115-
//jclass intClazz = env->FindClass("java/lang/Integer");
116119

117-
return TYPE_OBJECT;
120+
return TYPE_OBJECT;
118121
}
119122

120123
jclass javaFindClass(JNIEnv* env, std::string className) {
@@ -142,7 +145,7 @@ jobject v8ToJava(JNIEnv* env, v8::Local<v8::Value> arg, int *methodArgType) {
142145
jarray v8ToJava(JNIEnv* env, const v8::Arguments& args, int start, int end, std::list<int> *methodArgTypes) {
143146
jclass clazz = env->FindClass("java/lang/Object");
144147
jobjectArray results = env->NewObjectArray(end-start, clazz, NULL);
145-
148+
146149
for(int i=start; i<end; i++) {
147150
int methodArgType;
148151
jobject val = v8ToJava(env, args[i], &methodArgType);
@@ -151,6 +154,6 @@ jarray v8ToJava(JNIEnv* env, const v8::Arguments& args, int start, int end, std:
151154
methodArgTypes->push_back(methodArgType);
152155
}
153156
}
154-
157+
155158
return results;
156159
}

src/utils.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88
#include <string>
99

1010
typedef enum _jvalueType {
11+
TYPE_VOID,
1112
TYPE_INT,
1213
TYPE_OBJECT,
13-
TYPE_STRING
14+
TYPE_STRING,
15+
TYPE_BOOLEAN
1416
} jvalueType;
1517

1618
std::list<jobject> javaReflectionGetMethods(JNIEnv *env, jclass clazz);

test/simple-test.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,20 @@ exports['Simple'] = nodeunit.testCase({
2121
}
2222
});
2323
},
24-
24+
2525
"create an instance of a class and call methods (getName) (sync)": function(test) {
2626
var list = java.newInstanceSync("java.util.ArrayList");
2727
test.equal(list.sizeSync(), 0);
2828
list.addSync("hello");
2929
list.addSync("world");
3030
test.equal(list.sizeSync(), 2);
31+
list.clearSync();
3132
var clazz = list.getClassSync();
3233
var result = clazz.getNameSync();
3334
test.equal(result, "java.util.ArrayList");
3435
test.done();
3536
},
36-
37+
3738
"create an instance of a class and call methods (size) (async)": function(test) {
3839
java.newInstance("java.util.ArrayList", function(err, list) {
3940
if(err) { console.log(err); return; }

0 commit comments

Comments
 (0)