Skip to content

Commit d29c33f

Browse files
committed
added support for short arrays closes joeferner#64
1 parent b3fae85 commit d29c33f

10 files changed

Lines changed: 138 additions & 5 deletions

File tree

README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ java.callStaticMethodSync("Test", "staticMethodThatTakesALong", javaLong);
9898
* [setStaticFieldValue](#javaSetStaticFieldValue)
9999
* [newArray](#javaNewArray)
100100
* [newByte](#javaNewByte)
101+
* [newShort](#javaNewShort)
101102
* [newChar](#javaNewChar)
102103
* [newProxy](#javaNewProxy)
103104
@@ -229,6 +230,19 @@ __Example__
229230
230231
var b = java.newByte(12);
231232
233+
<a name="javaNewShort" />
234+
**java.newShort(val)**
235+
236+
Creates a new java short. This is needed because javascript does not have the concept of a short.
237+
238+
__Arguments__
239+
240+
* val - The value of the java short.
241+
242+
__Example__
243+
244+
var s = java.newShort(12);
245+
232246
<a name="javaNewChar" />
233247
**java.newChar(val)**
234248

src/java.cpp

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ long my_getThreadId() {
5252
NODE_SET_PROTOTYPE_METHOD(s_ct, "findClassSync", findClassSync);
5353
NODE_SET_PROTOTYPE_METHOD(s_ct, "newArray", newArray);
5454
NODE_SET_PROTOTYPE_METHOD(s_ct, "newByte", newByte);
55+
NODE_SET_PROTOTYPE_METHOD(s_ct, "newShort", newShort);
5556
NODE_SET_PROTOTYPE_METHOD(s_ct, "newChar", newChar);
5657
NODE_SET_PROTOTYPE_METHOD(s_ct, "getStaticFieldValue", getStaticFieldValue);
5758
NODE_SET_PROTOTYPE_METHOD(s_ct, "setStaticFieldValue", setStaticFieldValue);
@@ -486,6 +487,32 @@ void Java::destroyJVM(JavaVM** jvm, JNIEnv** env) {
486487
}
487488
}
488489

490+
else if(strcmp(className.c_str(), "short") == 0) {
491+
results = env->NewShortArray(arrayObj->Length());
492+
for(uint32_t i=0; i<arrayObj->Length(); i++) {
493+
v8::Local<v8::Value> item = arrayObj->Get(i);
494+
jobject val = v8ToJava(env, item);
495+
jclass shortClazz = env->FindClass("java/lang/Short");
496+
jmethodID short_shortValue = env->GetMethodID(shortClazz, "shortValue", "()S");
497+
jshort shortValues[1];
498+
shortValues[0] = env->CallShortMethod(val, short_shortValue);
499+
env->SetShortArrayRegion((jshortArray)results, i, 1, shortValues);
500+
}
501+
}
502+
503+
else if(strcmp(className.c_str(), "boolean") == 0) {
504+
results = env->NewBooleanArray(arrayObj->Length());
505+
for(uint32_t i=0; i<arrayObj->Length(); i++) {
506+
v8::Local<v8::Value> item = arrayObj->Get(i);
507+
jobject val = v8ToJava(env, item);
508+
jclass booleanClazz = env->FindClass("java/lang/Boolean");
509+
jmethodID boolean_booleanValue = env->GetMethodID(booleanClazz, "booleanValue", "()Z");
510+
jboolean booleanValues[1];
511+
booleanValues[0] = env->CallBooleanMethod(val, boolean_booleanValue);
512+
env->SetBooleanArrayRegion((jbooleanArray)results, i, 1, booleanValues);
513+
}
514+
}
515+
489516
else
490517
{
491518
jclass clazz = javaFindClass(env, className);
@@ -542,6 +569,34 @@ void Java::destroyJVM(JavaVM** jvm, JNIEnv** env) {
542569
return scope.Close(JavaObject::New(self, newObj));
543570
}
544571

572+
/*static*/ v8::Handle<v8::Value> Java::newShort(const v8::Arguments& args) {
573+
v8::HandleScope scope;
574+
Java* self = node::ObjectWrap::Unwrap<Java>(args.This());
575+
v8::Handle<v8::Value> ensureJvmResults = self->ensureJvm();
576+
if(!ensureJvmResults->IsUndefined()) {
577+
return ensureJvmResults;
578+
}
579+
JNIEnv* env = self->getJavaEnv();
580+
JavaScope javaScope(env);
581+
582+
if(args.Length() != 1) {
583+
return ThrowException(v8::Exception::TypeError(v8::String::New("newShort only takes 1 argument")));
584+
}
585+
586+
// argument - value
587+
if(!args[0]->IsNumber()) {
588+
return ThrowException(v8::Exception::TypeError(v8::String::New("Argument 1 must be a number")));
589+
}
590+
591+
v8::Local<v8::Number> val = args[0]->ToNumber();
592+
593+
jclass clazz = env->FindClass("java/lang/Short");
594+
jmethodID constructor = env->GetMethodID(clazz, "<init>", "(S)V");
595+
jobject newObj = env->NewObject(clazz, constructor, (jshort)val->Value());
596+
597+
return scope.Close(JavaObject::New(self, newObj));
598+
}
599+
545600
/*static*/ v8::Handle<v8::Value> Java::newChar(const v8::Arguments& args) {
546601
v8::HandleScope scope;
547602
Java* self = node::ObjectWrap::Unwrap<Java>(args.This());

src/java.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class Java : public node::ObjectWrap {
3131
static v8::Handle<v8::Value> newArray(const v8::Arguments& args);
3232
static v8::Handle<v8::Value> newByte(const v8::Arguments& args);
3333
static v8::Handle<v8::Value> newChar(const v8::Arguments& args);
34+
static v8::Handle<v8::Value> newShort(const v8::Arguments& args);
3435
static v8::Handle<v8::Value> getStaticFieldValue(const v8::Arguments& args);
3536
static v8::Handle<v8::Value> setStaticFieldValue(const v8::Arguments& args);
3637
v8::Handle<v8::Value> ensureJvm();

src/utils.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,8 @@ jvalueType javaGetType(JNIEnv *env, jclass type) {
173173
return TYPE_LONG;
174174
} else if(strcmp(typeStr, "boolean") == 0 || strcmp(typeStr, "class java.lang.Boolean") == 0) {
175175
return TYPE_BOOLEAN;
176+
} else if(strcmp(typeStr, "short") == 0 || strcmp(typeStr, "class java.lang.Short") == 0) {
177+
return TYPE_SHORT;
176178
} else if(strcmp(typeStr, "byte") == 0 || strcmp(typeStr, "class java.lang.Byte") == 0) {
177179
return TYPE_BYTE;
178180
} else if(strcmp(typeStr, "class java.lang.String") == 0) {
@@ -453,6 +455,16 @@ v8::Handle<v8::Value> javaArrayToV8(Java* java, JNIEnv* env, jobjectArray objArr
453455
}
454456
break;
455457

458+
case TYPE_SHORT:
459+
{
460+
jshort* elems = env->GetShortArrayElements((jshortArray)objArray, 0);
461+
for(jsize i=0; i<arraySize; i++) {
462+
result->Set(i, v8::Number::New(elems[i]));
463+
}
464+
env->ReleaseShortArrayElements((jshortArray)objArray, elems, 0);
465+
}
466+
break;
467+
456468
case TYPE_DOUBLE:
457469
{
458470
jdouble* elems = env->GetDoubleArrayElements((jdoubleArray)objArray, 0);
@@ -549,6 +561,13 @@ v8::Handle<v8::Value> javaToV8(Java* java, JNIEnv* env, jobject obj) {
549561
jint result = env->CallIntMethod(obj, integer_intValue);
550562
return scope.Close(v8::Integer::New(result));
551563
}
564+
case TYPE_SHORT:
565+
{
566+
jclass shortClazz = env->FindClass("java/lang/Short");
567+
jmethodID short_shortValue = env->GetMethodID(shortClazz, "shortValue", "()S");
568+
jshort result = env->CallShortMethod(obj, short_shortValue);
569+
return scope.Close(v8::Integer::New(result));
570+
}
552571
case TYPE_DOUBLE:
553572
{
554573
jclass doubleClazz = env->FindClass("java/lang/Double");

src/utils.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,11 @@ typedef enum _jvalueType {
2222
TYPE_OBJECT = 4,
2323
TYPE_STRING = 5,
2424
TYPE_BOOLEAN = 6,
25-
TYPE_BYTE = 7,
26-
TYPE_DOUBLE = 8,
27-
TYPE_FLOAT = 9,
28-
TYPE_ARRAY = 10
25+
TYPE_SHORT = 7,
26+
TYPE_BYTE = 8,
27+
TYPE_DOUBLE = 9,
28+
TYPE_FLOAT = 10,
29+
TYPE_ARRAY = 11
2930
} jvalueType;
3031

3132
struct DynamicProxyData {

test/Test$SubClass.class

0 Bytes
Binary file not shown.

test/Test$SuperClass.class

0 Bytes
Binary file not shown.

test/Test.class

396 Bytes
Binary file not shown.

test/Test.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,21 @@ public Test() {}
3030

3131
public static int staticByte(byte b) { return (int)b; }
3232
public static int staticChar(char ch) { return (int)ch; }
33+
public static short[] staticShortArray(Short[] arg) {
34+
short[] b = new short[arg.length];
35+
for(int i=0; i<arg.length; i++) { b[i] = arg[i]; }
36+
return b;
37+
}
38+
public static short[] staticShortArray(short[] arg) {
39+
short[] b = new short[arg.length];
40+
for(int i=0; i<arg.length; i++) { b[i] = arg[i]; }
41+
return b;
42+
}
43+
public static boolean[] staticBooleanArray(boolean[] arg) {
44+
boolean[] b = new boolean[arg.length];
45+
for(int i=0; i<arg.length; i++) { b[i] = arg[i]; }
46+
return b;
47+
}
3348
public static boolean[] staticBooleanArray(Boolean[] arg) {
3449
boolean[] b = new boolean[arg.length];
3550
for(int i=0; i<arg.length; i++) { b[i] = arg[i]; }

test/simple-test.js

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,13 +170,41 @@ exports['Simple'] = nodeunit.testCase({
170170
test.done();
171171
},
172172

173-
"new boolean array": function(test) {
173+
"new boolean array object": function(test) {
174174
var booleanArray = java.newArray("java.lang.Boolean", [true, false]);
175175
var r = java.callStaticMethodSync("Test", "staticBooleanArray", booleanArray);
176176
test.equal(r.length, 2);
177177
test.equal(r[0], true);
178178
test.equal(r[1], false);
179179
test.done();
180+
},
181+
182+
"new boolean array": function(test) {
183+
var booleanArray = java.newArray("boolean", [true, false]);
184+
var r = java.callStaticMethodSync("Test", "staticBooleanArray", booleanArray);
185+
test.equal(r.length, 2);
186+
test.equal(r[0], true);
187+
test.equal(r[1], false);
188+
test.done();
189+
},
190+
191+
"new short array objects": function(test) {
192+
var shortArray = java.newArray("java.lang.Short", [1, 2].map(function(c) { return java.newShort(c); }));
193+
var r = java.callStaticMethodSync("Test", "staticShortArray", shortArray);
194+
test.equal(r.length, 2);
195+
test.equal(r[0], 1);
196+
test.equal(r[1], 2);
197+
test.done();
198+
},
199+
200+
"new short array": function(test) {
201+
var shortArray = java.newArray("short", [1, 2]);
202+
var r = java.callStaticMethodSync("Test", "staticShortArray", shortArray);
203+
test.equal(r.length, 2);
204+
test.equal(r[0], 1);
205+
test.equal(r[1], 2);
206+
test.done();
180207
}
208+
181209
});
182210

0 commit comments

Comments
 (0)