2222 NODE_SET_PROTOTYPE_METHOD (s_ct, " newArray" , newArray);
2323 NODE_SET_PROTOTYPE_METHOD (s_ct, " newByte" , newByte);
2424 NODE_SET_PROTOTYPE_METHOD (s_ct, " getStaticFieldValue" , getStaticFieldValue);
25+ NODE_SET_PROTOTYPE_METHOD (s_ct, " setStaticFieldValue" , setStaticFieldValue);
2526
2627 target->Set (v8::String::NewSymbol (" Java" ), s_ct->GetFunction ());
2728}
@@ -121,7 +122,7 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
121122 callback = v8::Null ();
122123 }
123124
124- std::list<int > methodArgTypes;
125+ std::list<jvalueType > methodArgTypes;
125126 jarray methodArgs = v8ToJava (env, args, 1 , argsEnd, &methodArgTypes);
126127
127128 jclass clazz = javaFindClass (env, className);
@@ -179,7 +180,7 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
179180 std::string className = *classNameVal;
180181 argsStart++;
181182
182- std::list<int > methodArgTypes;
183+ std::list<jvalueType > methodArgTypes;
183184 jarray methodArgs = v8ToJava (env, args, argsStart, argsEnd, &methodArgTypes);
184185
185186 jclass clazz = javaFindClass (env, className);
@@ -244,7 +245,7 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
244245 }
245246
246247 // build args
247- std::list<int > methodArgTypes;
248+ std::list<jvalueType > methodArgTypes;
248249 jarray methodArgs = v8ToJava (env, args, 2 , argsEnd, &methodArgTypes);
249250
250251 // find class and method
@@ -309,7 +310,7 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
309310 std::string methodName = *methodNameVal;
310311
311312 // build args
312- std::list<int > methodArgTypes;
313+ std::list<jvalueType > methodArgTypes;
313314 jarray methodArgs = v8ToJava (env, args, 2 , argsEnd, &methodArgTypes);
314315
315316 // find class and method
@@ -366,7 +367,7 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
366367 if (strcmp (className.c_str (), " byte" ) == 0 ) {
367368 results = env->NewByteArray (arrayObj->Length ());
368369 for (uint32_t i=0 ; i<arrayObj->Length (); i++) {
369- int methodArgType;
370+ jvalueType methodArgType;
370371 v8::Local<v8::Value> item = arrayObj->Get (i);
371372 jobject val = v8ToJava (env, item, &methodArgType);
372373 jclass byteClazz = env->FindClass (" java/lang/Byte" );
@@ -390,7 +391,7 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
390391 results = env->NewObjectArray (arrayObj->Length (), clazz, NULL );
391392
392393 for (uint32_t i=0 ; i<arrayObj->Length (); i++) {
393- int methodArgType;
394+ jvalueType methodArgType;
394395 v8::Local<v8::Value> item = arrayObj->Get (i);
395396 jobject val = v8ToJava (env, item, &methodArgType);
396397 env->SetObjectArrayElement ((jobjectArray)results, i, val);
@@ -474,11 +475,72 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
474475 return ThrowException (javaExceptionToV8 (env, errStr.str ()));
475476 }
476477
477- // get field value
478478 jclass fieldClazz = env->FindClass (" java/lang/reflect/Field" );
479479 jmethodID field_get = env->GetMethodID (fieldClazz, " get" , " (Ljava/lang/Object;)Ljava/lang/Object;" );
480+ jmethodID field_getType = env->GetMethodID (fieldClazz, " getType" , " ()Ljava/lang/Class;" );
481+
482+ // get field type
483+ jclass fieldTypeClazz = (jclass)env->CallObjectMethod (field, field_getType);
484+ jvalueType resultType = javaGetType (env, fieldTypeClazz);
485+
486+ // get field value
480487 jobject val = env->CallObjectMethod (field, field_get, NULL );
481488
482- return scope.Close (JavaObject::New (self, val));
489+ return scope.Close (javaToV8 (self, env, resultType , val));
483490}
484491
492+ /* static*/ v8::Handle<v8::Value> Java::setStaticFieldValue (const v8::Arguments& args) {
493+ v8::HandleScope scope;
494+ Java* self = node::ObjectWrap::Unwrap<Java>(args.This ());
495+ v8::Handle<v8::Value> ensureJvmResults = self->ensureJvm ();
496+ if (!ensureJvmResults->IsUndefined ()) {
497+ return ensureJvmResults;
498+ }
499+ JNIEnv* env = self->getJavaEnv ();
500+
501+ // argument - className
502+ if (args.Length () < 1 || !args[0 ]->IsString ()) {
503+ return ThrowException (v8::Exception::TypeError (v8::String::New (" Argument 0 must be a string" )));
504+ }
505+ v8::Local<v8::String> classNameObj = v8::Local<v8::String>::Cast (args[0 ]);
506+ v8::String::AsciiValue classNameVal (classNameObj);
507+ std::string className = *classNameVal;
508+
509+ // argument - field name
510+ if (args.Length () < 2 || !args[1 ]->IsString ()) {
511+ return ThrowException (v8::Exception::TypeError (v8::String::New (" Argument 1 must be a string" )));
512+ }
513+ v8::Local<v8::String> fieldNameObj = v8::Local<v8::String>::Cast (args[1 ]);
514+ v8::String::AsciiValue fieldNameVal (fieldNameObj);
515+ std::string fieldName = *fieldNameVal;
516+
517+ // argument - new value
518+ if (args.Length () < 3 ) {
519+ return ThrowException (v8::Exception::TypeError (v8::String::New (" setStaticFieldValue requires 3 arguments" )));
520+ }
521+ jvalueType methodArgType;
522+ jobject newValue = v8ToJava (env, args[2 ], &methodArgType);
523+
524+ // find the class
525+ jclass clazz = javaFindClass (env, className);
526+ if (clazz == NULL ) {
527+ std::ostringstream errStr;
528+ errStr << " Could not create class " << className.c_str ();
529+ return ThrowException (javaExceptionToV8 (env, errStr.str ()));
530+ }
531+
532+ // get the field
533+ jobject field = javaFindField (env, clazz, fieldName);
534+ if (field == NULL ) {
535+ std::ostringstream errStr;
536+ errStr << " Could not find field " << fieldName.c_str () << " on class " << className.c_str ();
537+ return ThrowException (javaExceptionToV8 (env, errStr.str ()));
538+ }
539+
540+ jclass fieldClazz = env->FindClass (" java/lang/reflect/Field" );
541+ jmethodID field_set = env->GetMethodID (fieldClazz, " set" , " (Ljava/lang/Object;Ljava/lang/Object;)V" );
542+
543+ // set field value
544+ env->CallObjectMethod (field, field_set, NULL , newValue);
545+ return v8::Undefined ();
546+ }
0 commit comments