RHO_GLOBAL int rho_sysimpl_get_property(char* szPropName, VALUE* resValue) { JNIEnv *env = jnienv(); jclass cls = getJNIClass(RHODES_JAVA_CLASS_RHODES_SERVICE); if (!cls) return 0; jmethodID mid = getJNIClassStaticMethod(env, cls, "getProperty", "(Ljava/lang/String;)Ljava/lang/Object;"); if (!mid) return 0; jhstring propNameObj = rho_cast<jhstring>(szPropName); jhobject result = jhobject(env->CallStaticObjectMethod(cls, mid, propNameObj.get())); if (!result) return 0; jclass clsBoolean = getJNIClass(RHODES_JAVA_CLASS_BOOLEAN); jclass clsInteger = getJNIClass(RHODES_JAVA_CLASS_INTEGER); jclass clsFloat = getJNIClass(RHODES_JAVA_CLASS_FLOAT); jclass clsDouble = getJNIClass(RHODES_JAVA_CLASS_DOUBLE); jclass clsString = getJNIClass(RHODES_JAVA_CLASS_STRING); if (env->IsInstanceOf(result.get(), clsBoolean)) { jmethodID midValue = getJNIClassMethod(env, clsBoolean, "booleanValue", "()Z"); *resValue = rho_ruby_create_boolean((int)env->CallBooleanMethod(result.get(), midValue)); return 1; } else if (env->IsInstanceOf(result.get(), clsInteger)) { jmethodID midValue = getJNIClassMethod(env, clsInteger, "intValue", "()I"); *resValue = rho_ruby_create_integer((int)env->CallIntMethod(result.get(), midValue)); return 1; } else if (env->IsInstanceOf(result.get(), clsFloat)) { jmethodID midValue = getJNIClassMethod(env, clsFloat, "floatValue", "()F"); *resValue = rho_ruby_create_double((double)env->CallFloatMethod(result.get(), midValue)); return 1; } else if (env->IsInstanceOf(result.get(), clsDouble)) { jmethodID midValue = getJNIClassMethod(env, clsDouble, "doubleValue", "()D"); *resValue = rho_ruby_create_double((double)env->CallDoubleMethod(result.get(), midValue)); return 1; } else if (env->IsInstanceOf(result.get(), clsString)) { jstring resStrObj = (jstring)result.get(); *resValue = rho_ruby_create_string(rho_cast<std::string>(resStrObj).c_str()); return 1; } return 0; }
VALUE rho_cast_helper<VALUE, jdouble>::operator ()(JNIEnv *env, jdouble jValue) { return rho_ruby_create_double(static_cast<double>(jValue)); }
VALUE rho_cast_helper<VALUE, jobject>::getDouble(jobject jDouble) { jboolean jRes = m_env->CallDoubleMethod(jDouble, midDoubleValue); return rho_ruby_create_double(jRes); }
VALUE MethodResultJni::toRuby() { RAWTRACE("toRuby"); VALUE res = Qnil; JNIEnv *env = jniInit(); if (!env) { RAWLOG_FATAL("JNI initialization failed"); rb_raise(rb_eRuntimeError,"JNI initialization failed"); return Qnil; } int type = getResultType(env); switch(type) { case typeNone: break; case typeBoolean: { bool booleanResult = static_cast<bool>(getBooleanResult(env)); res = booleanResult ? Qtrue : Qfalse; } break; case typeInteger: { int intResult = static_cast<int>(getIntegerResult(env)); res = rho_ruby_create_integer(intResult); } break; case typeDouble: { double doubleResult = static_cast<double>(getDoubleResult(env)); res = rho_ruby_create_double(doubleResult); } break; case typeString: { jhstring jhStrResult = getStringResult(env); res = rho_cast<VALUE>(env, jhStrResult); } break; case typeList: { jhobject jhListResult = getListResult(env); res = rho_cast<VALUE>(env, jhListResult); } break; case typeMap: { jhobject jhMapResult = getMapResult(env); res = rho_cast<VALUE>(env, jhMapResult); } break; case typeArgError: rho_ruby_raise_argerror(getErrorMessage(env).c_str()); break; case typeError: rb_raise(rb_eRuntimeError, getErrorMessage(env).c_str()); break; default: RAWLOG_FATAL("Unknown runtime error in MethodResultJni class"); rb_raise(rb_eRuntimeError,"Unknown runtime error in MethodResultJni class"); } reset(env); return res; }