/*static*/ v8::Handle<v8::Value> JavaObject::fieldGetter(v8::Local<v8::String> property, const v8::AccessorInfo& info) { v8::HandleScope scope; JavaObject* self = node::ObjectWrap::Unwrap<JavaObject>(info.This()); JNIEnv *env = self->m_java->getJavaEnv(); JavaScope javaScope(env); v8::String::AsciiValue propertyCStr(property); std::string propertyStr = *propertyCStr; jobject field = javaFindField(env, self->m_class, propertyStr); if(field == NULL) { std::ostringstream errStr; errStr << "Could not find field " << propertyStr; v8::Handle<v8::Value> ex = javaExceptionToV8(env, errStr.str()); return ThrowException(ex); } jclass fieldClazz = env->FindClass("java/lang/reflect/Field"); jmethodID field_get = env->GetMethodID(fieldClazz, "get", "(Ljava/lang/Object;)Ljava/lang/Object;"); // get field value jobject val = env->CallObjectMethod(field, field_get, self->m_obj); if(env->ExceptionOccurred()) { std::ostringstream errStr; errStr << "Could not get field " << propertyStr; v8::Handle<v8::Value> ex = javaExceptionToV8(env, errStr.str()); return ThrowException(ex); } v8::Handle<v8::Value> result = javaToV8(self->m_java, env, val); return scope.Close(result); }
v8::Handle<v8::Value> MethodCallBaton::resultsToV8(JNIEnv *env) { v8::HandleScope scope; if(m_error) { v8::Handle<v8::Value> err = javaExceptionToV8(env, m_error, m_errorString); return scope.Close(err); } return scope.Close(javaToV8(m_java, env, m_result)); }
v8::Handle<v8::Value> javaArrayToV8(Java* java, JNIEnv* env, jobjectArray objArray) { v8::HandleScope scope; if(objArray == NULL) { return v8::Null(); } //printf("javaArrayToV8: %d %s\n", javaObjectToString(env, objArray).c_str()); jsize arraySize = env->GetArrayLength(objArray); //printf("array size: %d\n", arraySize); v8::Handle<v8::Array> result = v8::Array::New(arraySize); for(jsize i=0; i<arraySize; i++) { jobject obj = env->GetObjectArrayElement(objArray, i); v8::Handle<v8::Value> item = javaToV8(java, env, obj); result->Set(i, item); } return scope.Close(result); }
v8::Handle<v8::Value> javaArrayToV8(Java* java, JNIEnv* env, jobjectArray objArray) { v8::HandleScope scope; if(objArray == NULL) { return v8::Null(); } jvalueType arrayComponentType = javaGetArrayComponentType(env, objArray); //printf("javaArrayToV8: %d %s\n", arrayComponentType, javaObjectToString(env, objArray).c_str()); jsize arraySize = env->GetArrayLength(objArray); //printf("array size: %d\n", arraySize); v8::Handle<v8::Array> result = v8::Array::New(arraySize); switch(arrayComponentType) { case TYPE_INT: { jint* elems = env->GetIntArrayElements((jintArray)objArray, 0); for(jsize i=0; i<arraySize; i++) { result->Set(i, v8::Integer::New(elems[i])); } env->ReleaseIntArrayElements((jintArray)objArray, elems, 0); } break; case TYPE_BYTE: { jbyte* elems = env->GetByteArrayElements((jbyteArray)objArray, 0); for(jsize i=0; i<arraySize; i++) { result->Set(i, v8::Number::New(elems[i])); } env->ReleaseByteArrayElements((jbyteArray)objArray, elems, 0); } break; case TYPE_BOOLEAN: { jboolean* elems = env->GetBooleanArrayElements((jbooleanArray)objArray, 0); for(jsize i=0; i<arraySize; i++) { result->Set(i, v8::Boolean::New(elems[i])); } env->ReleaseBooleanArrayElements((jbooleanArray)objArray, elems, 0); } break; case TYPE_SHORT: { jshort* elems = env->GetShortArrayElements((jshortArray)objArray, 0); for(jsize i=0; i<arraySize; i++) { result->Set(i, v8::Number::New(elems[i])); } env->ReleaseShortArrayElements((jshortArray)objArray, elems, 0); } break; case TYPE_DOUBLE: { jdouble* elems = env->GetDoubleArrayElements((jdoubleArray)objArray, 0); for(jsize i=0; i<arraySize; i++) { result->Set(i, v8::Number::New(elems[i])); } env->ReleaseDoubleArrayElements((jdoubleArray)objArray, elems, 0); } break; case TYPE_FLOAT: { jfloat* elems = env->GetFloatArrayElements((jfloatArray)objArray, 0); for(jsize i=0; i<arraySize; i++) { result->Set(i, v8::Number::New(elems[i])); } env->ReleaseFloatArrayElements((jfloatArray)objArray, elems, 0); } break; case TYPE_LONG: { jlong* elems = env->GetLongArrayElements((jlongArray)objArray, 0); for(jsize i=0; i<arraySize; i++) { jobject obj = longToJavaLongObj(env, elems[i]); result->Set(i, JavaObject::New(java, obj)); } env->ReleaseLongArrayElements((jlongArray)objArray, elems, 0); } break; default: for(jsize i=0; i<arraySize; i++) { jobject obj = env->GetObjectArrayElement(objArray, i); v8::Handle<v8::Value> item = javaToV8(java, env, obj); result->Set(i, item); } break; } return scope.Close(result); }