2121 NODE_SET_PROTOTYPE_METHOD (s_ct, " callStaticMethodSync" , callStaticMethodSync);
2222 NODE_SET_PROTOTYPE_METHOD (s_ct, " newArray" , newArray);
2323 NODE_SET_PROTOTYPE_METHOD (s_ct, " newByte" , newByte);
24+ NODE_SET_PROTOTYPE_METHOD (s_ct, " getStaticFieldValue" , getStaticFieldValue);
2425
2526 target->Set (v8::String::NewSymbol (" Java" ), s_ct->GetFunction ());
2627}
@@ -137,6 +138,17 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
137138 }
138139 std::list<jobject> constructors = javaReflectionGetConstructors (env, clazz);
139140 jobject method = javaFindBestMatchingConstructor (env, constructors, methodArgTypes);
141+ if (method == NULL ) {
142+ std::ostringstream errStr;
143+ errStr << " Could not find constructor" ;
144+ v8::Handle<v8::Value> error = javaExceptionToV8 (env, errStr.str ());
145+
146+ v8::Handle<v8::Value> argv[2 ];
147+ argv[0 ] = error;
148+ argv[1 ] = v8::Undefined ();
149+ v8::Function::Cast (*callback)->Call (v8::Context::GetCurrent ()->Global (), 2 , argv);
150+ return v8::Undefined ();
151+ }
140152
141153 // run
142154 NewInstanceBaton* baton = new NewInstanceBaton (self, clazz, method, methodArgs, callback);
@@ -155,6 +167,7 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
155167 JNIEnv* env = self->getJavaEnv ();
156168
157169 int argsEnd = args.Length ();
170+ int argsStart = 0 ;
158171
159172 // argument - className
160173 if (args.Length () < 1 || !args[0 ]->IsString ()) {
@@ -163,9 +176,10 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
163176 v8::Local<v8::String> classNameObj = v8::Local<v8::String>::Cast (args[0 ]);
164177 v8::String::AsciiValue classNameVal (classNameObj);
165178 std::string className = *classNameVal;
179+ argsStart++;
166180
167181 std::list<int > methodArgTypes;
168- jarray methodArgs = v8ToJava (env, args, 1 , argsEnd, &methodArgTypes);
182+ jarray methodArgs = v8ToJava (env, args, argsStart , argsEnd, &methodArgTypes);
169183
170184 jclass clazz = javaFindClass (env, className);
171185 if (clazz == NULL ) {
@@ -175,6 +189,11 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
175189 }
176190 std::list<jobject> constructors = javaReflectionGetConstructors (env, clazz);
177191 jobject method = javaFindBestMatchingConstructor (env, constructors, methodArgTypes);
192+ if (method == NULL ) {
193+ std::ostringstream errStr;
194+ errStr << " Could not find constructor" ;
195+ return ThrowException (javaExceptionToV8 (env, errStr.str ()));
196+ }
178197
179198 // run
180199 v8::Handle<v8::Value> callback = v8::Object::New ();
@@ -412,3 +431,53 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
412431
413432 return scope.Close (JavaObject::New (self, newObj));
414433}
434+
435+ /* static*/ v8::Handle<v8::Value> Java::getStaticFieldValue (const v8::Arguments& args) {
436+ v8::HandleScope scope;
437+ Java* self = node::ObjectWrap::Unwrap<Java>(args.This ());
438+ v8::Handle<v8::Value> ensureJvmResults = self->ensureJvm ();
439+ if (!ensureJvmResults->IsUndefined ()) {
440+ return ensureJvmResults;
441+ }
442+ JNIEnv* env = self->getJavaEnv ();
443+
444+ // argument - className
445+ if (args.Length () < 1 || !args[0 ]->IsString ()) {
446+ return ThrowException (v8::Exception::TypeError (v8::String::New (" Argument 0 must be a string" )));
447+ }
448+ v8::Local<v8::String> classNameObj = v8::Local<v8::String>::Cast (args[0 ]);
449+ v8::String::AsciiValue classNameVal (classNameObj);
450+ std::string className = *classNameVal;
451+
452+ // argument - field name
453+ if (args.Length () < 2 || !args[1 ]->IsString ()) {
454+ return ThrowException (v8::Exception::TypeError (v8::String::New (" Argument 1 must be a string" )));
455+ }
456+ v8::Local<v8::String> fieldNameObj = v8::Local<v8::String>::Cast (args[1 ]);
457+ v8::String::AsciiValue fieldNameVal (fieldNameObj);
458+ std::string fieldName = *fieldNameVal;
459+
460+ // find the class
461+ jclass clazz = javaFindClass (env, className);
462+ if (clazz == NULL ) {
463+ std::ostringstream errStr;
464+ errStr << " Could not create class " << className.c_str ();
465+ return ThrowException (javaExceptionToV8 (env, errStr.str ()));
466+ }
467+
468+ // get the field
469+ jobject field = javaFindField (env, clazz, fieldName);
470+ if (field == NULL ) {
471+ std::ostringstream errStr;
472+ errStr << " Could not find field " << fieldName.c_str () << " on class " << className.c_str ();
473+ return ThrowException (javaExceptionToV8 (env, errStr.str ()));
474+ }
475+
476+ // get field value
477+ jclass fieldClazz = env->FindClass (" java/lang/reflect/Field" );
478+ jmethodID field_get = env->GetMethodID (fieldClazz, " get" , " (Ljava/lang/Object;)Ljava/lang/Object;" );
479+ jobject val = env->CallObjectMethod (field, field_get, NULL );
480+
481+ return scope.Close (JavaObject::New (self, val));
482+ }
483+
0 commit comments