Skip to content

Commit 732d26d

Browse files
committed
store javascript object in java
1 parent bc4588b commit 732d26d

4 files changed

Lines changed: 60 additions & 2 deletions

File tree

src-java/node/NodeObject.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package node;
2+
3+
import java.lang.reflect.Constructor;
4+
import java.lang.reflect.Method;
5+
import java.lang.reflect.Array;
6+
import java.util.Arrays;
7+
8+
public class NodeObject {
9+
private final long handle;
10+
11+
public NodeObject(long handle) {
12+
this.handle = handle;
13+
}
14+
15+
public long getHandle() {
16+
return this.handle;
17+
}
18+
}

src/utils.cpp

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
jobject v8ToJava_javaObject(JNIEnv* env, v8::Local<v8::Object> obj);
1212
jobject v8ToJava_javaLong(JNIEnv* env, v8::Local<v8::Object> obj);
13+
jobject v8ToJava_v8Object(JNIEnv* env, v8::Local<v8::Object> obj);
1314

1415
void javaReflectionGetMethods(JNIEnv *env, jclass clazz, std::list<jobject>* methods, bool includeStatic) {
1516
jclass clazzclazz = env->FindClass("java/lang/Class");
@@ -362,14 +363,26 @@ jobject v8ToJava(JNIEnv* env, v8::Local<v8::Value> arg) {
362363
if(!isJavaLong.IsEmpty() && isJavaLong->IsBoolean()) {
363364
return v8ToJava_javaLong(env, obj);
364365
}
366+
367+
return v8ToJava_v8Object(env, obj);
365368
}
366369

367370
// 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);
369372
// printf("v8ToJava: Unhandled type: %s\n", *typeStr);
370373
return NULL;
371374
}
372375

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+
373386
jobject v8ToJava_javaObject(JNIEnv* env, v8::Local<v8::Object> obj) {
374387
JavaObject* javaObject = Nan::ObjectWrap::Unwrap<JavaObject>(obj);
375388
return javaObject->getObject();
@@ -644,11 +657,18 @@ v8::Local<v8::Value> javaToV8(Java* java, JNIEnv* env, jobject obj, DynamicProxy
644657
}
645658
case TYPE_STRING:
646659
return Nan::New<v8::String>(javaObjectToString(env, obj).c_str()).ToLocalChecked();
647-
case TYPE_OBJECT:
660+
case TYPE_OBJECT: {
648661
if (dynamicProxyData != NULL) {
649662
return JavaProxyObject::New(java, obj, dynamicProxyData);
650663
}
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+
}
651670
return JavaObject::New(java, obj);
671+
}
652672
default:
653673
printf("javaToV8: unhandled type: 0x%03x\n", resultType);
654674
return JavaObject::New(java, obj);

test/Test.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ public class Test {
55
public static int staticFieldInt = 42;
66
public static double staticFieldDouble = 42.5;
77
public static Test[] staticArrayObjects = null;
8+
public static Object staticFieldObject = null;
89

910
public Test() {}
1011
public Test(Integer i) { this.i = i; }
@@ -42,6 +43,9 @@ public Test() {}
4243
public static int staticMethodAmbiguous(Double a) { return 1; }
4344
public static int staticMethodAmbiguous(Integer a) { return 2; }
4445

46+
public static void staticMethodSetObject(Object obj) { staticFieldObject = obj; }
47+
public static Object staticMethodGetObject() { return staticFieldObject; }
48+
4549
public int methodAmbiguous(Double a) { return 1; }
4650
public int methodAmbiguous(Integer a) { return 2; }
4751

test/java-callStaticMethod-test.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,5 +288,21 @@ exports['Java - Call Static Method'] = nodeunit.testCase({
288288
test.ifError(err);
289289
test.done();
290290
});
291+
},
292+
293+
"Call static method with javascript objects": function(test) {
294+
var Test = java.import("Test");
295+
var obj = Test.staticMethodGetObjectSync();
296+
test.equal(obj, null);
297+
298+
obj = function() { return 42; };
299+
Test.staticMethodSetObjectSync(obj);
300+
301+
obj = Test.staticMethodGetObjectSync();
302+
test.notEqual(obj, null);
303+
console.log('zzzzzzzzzzzzzzzzzzzzzzzz', obj);
304+
test.equal(obj(), 42);
305+
306+
test.done();
291307
}
292308
});

0 commit comments

Comments
 (0)