jvalueType javaGetArrayComponentType(JNIEnv *env, jobjectArray array) { jclass objectClazz = env->FindClass("java/lang/Object"); jclass clazzclazz = env->FindClass("java/lang/Class"); jmethodID object_getClass = env->GetMethodID(objectClazz, "getClass", "()Ljava/lang/Class;"); jobject arrayClass = env->CallObjectMethod(array, object_getClass); jmethodID class_getComponentType = env->GetMethodID(clazzclazz, "getComponentType", "()Ljava/lang/Class;"); jobject arrayComponentTypeClass = env->CallObjectMethod(arrayClass, class_getComponentType); jvalueType arrayComponentType = javaGetType(env, (jclass)arrayComponentTypeClass); return arrayComponentType; }
v8::Handle<v8::Value> javaToV8(Java* java, JNIEnv* env, jobject obj) { v8::HandleScope scope; if(obj == NULL) { return v8::Null(); } jclass objClazz = env->GetObjectClass(obj); jvalueType resultType = javaGetType(env, objClazz); //printf("javaToV8: %d %s\n", resultType, javaObjectToString(env, obj).c_str()); switch(resultType) { case TYPE_ARRAY: { v8::Handle<v8::Value> result = javaArrayToV8(java, env, (jobjectArray)obj); return scope.Close(result); } case TYPE_VOID: return v8::Undefined(); case TYPE_BOOLEAN: { jclass booleanClazz = env->FindClass("java/lang/Boolean"); jmethodID boolean_booleanValue = env->GetMethodID(booleanClazz, "booleanValue", "()Z"); bool result = env->CallBooleanMethod(obj, boolean_booleanValue); return scope.Close(v8::Boolean::New(result)); } case TYPE_BYTE: { jclass byteClazz = env->FindClass("java/lang/Byte"); jmethodID byte_byteValue = env->GetMethodID(byteClazz, "byteValue", "()B"); jbyte result = env->CallByteMethod(obj, byte_byteValue); return scope.Close(v8::Number::New(result)); } case TYPE_LONG: { jclass longClazz = env->FindClass("java/lang/Long"); jmethodID long_longValue = env->GetMethodID(longClazz, "longValue", "()J"); jlong result = env->CallLongMethod(obj, long_longValue); std::string strValue = javaObjectToString(env, obj); v8::Local<v8::Value> v8Result = v8::NumberObject::New(result); v8::NumberObject* v8ResultNumberObject = v8::NumberObject::Cast(*v8Result); v8ResultNumberObject->Set(v8::String::New("longValue"), v8::String::New(strValue.c_str())); v8ResultNumberObject->SetHiddenValue(v8::String::New(V8_HIDDEN_MARKER_JAVA_LONG), v8::Boolean::New(true)); return scope.Close(v8Result); } case TYPE_INT: { jclass integerClazz = env->FindClass("java/lang/Integer"); jmethodID integer_intValue = env->GetMethodID(integerClazz, "intValue", "()I"); jint result = env->CallIntMethod(obj, integer_intValue); return scope.Close(v8::Integer::New(result)); } case TYPE_SHORT: { jclass shortClazz = env->FindClass("java/lang/Short"); jmethodID short_shortValue = env->GetMethodID(shortClazz, "shortValue", "()S"); jshort result = env->CallShortMethod(obj, short_shortValue); return scope.Close(v8::Integer::New(result)); } case TYPE_DOUBLE: { jclass doubleClazz = env->FindClass("java/lang/Double"); jmethodID double_doubleValue = env->GetMethodID(doubleClazz, "doubleValue", "()D"); jdouble result = env->CallDoubleMethod(obj, double_doubleValue); return scope.Close(v8::Number::New(result)); } case TYPE_FLOAT: { jclass floatClazz = env->FindClass("java/lang/Float"); jmethodID float_floatValue = env->GetMethodID(floatClazz, "floatValue", "()F"); jfloat result = env->CallFloatMethod(obj, float_floatValue); return scope.Close(v8::Number::New(result)); } case TYPE_STRING: return scope.Close(v8::String::New(javaObjectToString(env, obj).c_str())); case TYPE_OBJECT: return scope.Close(JavaObject::New(java, obj)); default: printf("javaToV8: unhandled type: 0x%03x\n", resultType); return scope.Close(JavaObject::New(java, obj)); } return v8::Undefined(); }
v8::Handle<v8::Value> javaToV8(Java* java, JNIEnv* env, jobject obj) { v8::HandleScope scope; if(obj == NULL) { return v8::Null(); } jclass objClazz = env->GetObjectClass(obj); jvalueType resultType = javaGetType(env, objClazz); //printf("javaToV8: %d %s\n", resultType, javaObjectToString(env, obj).c_str()); switch(resultType) { case TYPE_ARRAY: { v8::Handle<v8::Value> result = javaArrayToV8(java, env, (jobjectArray)obj); return scope.Close(result); } case TYPE_VOID: return v8::Undefined(); case TYPE_BOOLEAN: { jclass booleanClazz = env->FindClass("java/lang/Boolean"); jmethodID boolean_booleanValue = env->GetMethodID(booleanClazz, "booleanValue", "()Z"); bool result = env->CallBooleanMethod(obj, boolean_booleanValue); return scope.Close(v8::Boolean::New(result)); } case TYPE_BYTE: { jclass byteClazz = env->FindClass("java/lang/Byte"); jmethodID byte_byteValue = env->GetMethodID(byteClazz, "byteValue", "()B"); jbyte result = env->CallByteMethod(obj, byte_byteValue); return scope.Close(v8::Number::New(result)); } case TYPE_LONG: { jclass longClazz = env->FindClass("java/lang/Long"); jmethodID long_longValue = env->GetMethodID(longClazz, "longValue", "()J"); jlong result = env->CallLongMethod(obj, long_longValue); return scope.Close(v8::Number::New(result)); } case TYPE_INT: { jclass integerClazz = env->FindClass("java/lang/Integer"); jmethodID integer_intValue = env->GetMethodID(integerClazz, "intValue", "()I"); jint result = env->CallIntMethod(obj, integer_intValue); return scope.Close(v8::Integer::New(result)); } case TYPE_DOUBLE: { jclass doubleClazz = env->FindClass("java/lang/Double"); jmethodID double_doubleValue = env->GetMethodID(doubleClazz, "doubleValue", "()D"); jdouble result = env->CallDoubleMethod(obj, double_doubleValue); return scope.Close(v8::Number::New(result)); } case TYPE_STRING: return scope.Close(v8::String::New(javaObjectToString(env, obj).c_str())); case TYPE_OBJECT: return scope.Close(JavaObject::New(java, obj)); default: printf("unhandled type: 0x%03x\n", resultType); return scope.Close(JavaObject::New(java, obj)); } return v8::Undefined(); }