#include #include #include "mlp_java_priv.h" static mlp_java_runtime *init_jrt(mlp_context *ctx, JavaVM *jvm, JNIEnv *env){ jclass class = load_class(ctx, env, "java/lang/Class") ; RETURN_NULL_IF_NULL(class) ; jmethodID class_getName = get_method(ctx, env, "java/lang/Class", class, "getName", "()Ljava/lang/String;") ; RETURN_NULL_IF_NULL(class_getName) ; jclass throwable = load_class(ctx, env, "java/lang/Throwable") ; RETURN_NULL_IF_NULL(throwable) ; jmethodID throwable_getMessage = get_method(ctx, env, "java/lang/Throwable", throwable, "getMessage", "()Ljava/lang/String;") ; RETURN_NULL_IF_NULL(throwable_getMessage) ; jclass api = load_class(ctx, env, "mlp/java/MLPJavaAPI") ; RETURN_NULL_IF_NULL(api) ; jmethodID api_newObject = get_static_method(ctx, env, "mlp/java/MLPJavaAPI", api, "newObject", "(Ljava/lang/String;[Lmlp/MLPValue;Ljava/lang/String;)Lmlp/MLPValue;") ; RETURN_NULL_IF_NULL(api_newObject) ; jmethodID api_callMethod = get_static_method(ctx, env, "mlp/java/MLPJavaAPI", api, "callMethod", "(Lmlp/java/MLPJavaObject;Ljava/lang/String;[Lmlp/MLPValue;Ljava/lang/String;)Lmlp/MLPValue;") ; RETURN_NULL_IF_NULL(api_callMethod) ; jclass utils = load_class(ctx, env, "mlp/MLPUtils") ; RETURN_NULL_IF_NULL(utils) ; jmethodID utils_setDebug = get_static_method(ctx, env, "mlp/MLPUtils", utils, "setDebug", "(I)V") ; RETURN_NULL_IF_NULL(utils_setDebug) ; jclass value = load_class(ctx, env, "mlp/MLPValue") ; RETURN_NULL_IF_NULL(value) ; jmethodID value_getTypeNo = get_method(ctx, env, "mlp/MLPValue", value, "getTypeNo", "()I") ; RETURN_NULL_IF_NULL(value_getTypeNo) ; jmethodID value_new_bool = get_method(ctx, env, "mlp/MLPValue", value, "", "(Z)V") ; RETURN_NULL_IF_NULL(value_new_bool) ; jmethodID value_getBool = get_method(ctx, env, "mlp/MLPValue", value, "getBool", "()Z") ; RETURN_NULL_IF_NULL(value_getBool) ; jmethodID value_new_long = get_method(ctx, env, "mlp/MLPValue", value, "", "(J)V") ; RETURN_NULL_IF_NULL(value_new_long) ; jmethodID value_getLong = get_method(ctx, env, "mlp/MLPValue", value, "getLong", "()J") ; RETURN_NULL_IF_NULL(value_getLong) ; jmethodID value_new_double = get_method(ctx, env, "mlp/MLPValue", value, "", "(D)V") ; RETURN_NULL_IF_NULL(value_new_double) ; jmethodID value_getDouble = get_method(ctx, env, "mlp/MLPValue", value, "getDouble", "()D") ; RETURN_NULL_IF_NULL(value_getDouble) ; jmethodID value_new_char = get_method(ctx, env, "mlp/MLPValue", value, "", "(C)V") ; RETURN_NULL_IF_NULL(value_new_char) ; jmethodID value_getChar = get_method(ctx, env, "mlp/MLPValue", value, "getChar", "()C") ; RETURN_NULL_IF_NULL(value_getChar) ; jmethodID value_new_string = get_method(ctx, env, "mlp/MLPValue", value, "", "(Ljava/lang/String;)V") ; RETURN_NULL_IF_NULL(value_new_string) ; jmethodID value_getString = get_method(ctx, env, "mlp/MLPValue", value, "getString", "()Ljava/lang/String;") ; RETURN_NULL_IF_NULL(value_getString) ; jmethodID value_new_object = get_method(ctx, env, "mlp/MLPValue", value, "", "(Lmlp/MLPObject;)V") ; RETURN_NULL_IF_NULL(value_new_object) ; jmethodID value_getObject = get_method(ctx, env, "mlp/MLPValue", value, "getObject", "()Lmlp/MLPObject;") ; RETURN_NULL_IF_NULL(value_getString) ; jmethodID value_getException = get_method(ctx, env, "mlp/MLPValue", value, "getException", "()Lmlp/MLPException;") ; RETURN_NULL_IF_NULL(value_getString) ; jclass object = load_class(ctx, env, "mlp/MLPObject") ; RETURN_NULL_IF_NULL(object) ; jmethodID object_getClassName = get_method(ctx, env, "mlp/MLPObject", object, "getClassName", "()Ljava/lang/String;") ; RETURN_NULL_IF_NULL(object_getClassName) ; jclass java_object = load_class(ctx, env, "mlp/java/MLPJavaObject") ; RETURN_NULL_IF_NULL(java_object) ; jmethodID java_object_getClassName = get_method(ctx, env, "mlp/java/MLPJavaObject", java_object, "getClassName", "()Ljava/lang/String;") ; RETURN_NULL_IF_NULL(java_object_getClassName) ; jmethodID java_object_getObject = get_method(ctx, env, "mlp/java/MLPJavaObject", java_object, "getObject", "()Ljava/lang/Object;") ; RETURN_NULL_IF_NULL(java_object_getObject) ; jmethodID java_object_new = get_method(ctx, env, "mlp/java/MLPJavaObject", java_object, "", "(Ljava/lang/Object;Ljava/lang/Class;)V") ; RETURN_NULL_IF_NULL(java_object_new) ; jclass exception = load_class(ctx, env, "mlp/MLPException") ; RETURN_NULL_IF_NULL(exception) ; jmethodID exception_getMessage = get_method(ctx, env, "mlp/MLPException", exception, "getMessage", "()Ljava/lang/String;") ; RETURN_NULL_IF_NULL(exception_getMessage) ; jclass java_exception = load_class(ctx, env, "mlp/java/MLPJavaException") ; RETURN_NULL_IF_NULL(java_exception) ; jmethodID java_exception_getMessage = get_method(ctx, env, "mlp/java/MLPJavaException", java_exception, "getMessage", "()Ljava/lang/String;") ; RETURN_NULL_IF_NULL(java_exception_getMessage) ; jmethodID java_exception_getValue = get_method(ctx, env, "mlp/java/MLPJavaException", java_exception, "getValue", "()Lmlp/MLPValue;") ; RETURN_NULL_IF_NULL(java_exception_getValue) ; mlp_java_runtime *jrt = MLP_CALLOC(mlp_java_runtime) ; jrt->jvm = jvm ; jrt->class = class ; jrt->class_getName = class_getName ; jrt->throwable = throwable ; jrt->throwable_getMessage = throwable_getMessage ; jrt->api = api ; jrt->api_newObject = api_newObject ; jrt->api_callMethod = api_callMethod ; jrt->value = value ; jrt->value_getTypeNo = value_getTypeNo ; jrt->value_new_bool = value_new_bool ; jrt->value_getBool = value_getBool ; jrt->value_new_long = value_new_long ; jrt->value_getLong = value_getLong ; jrt->value_new_double = value_new_double ; jrt->value_getDouble = value_getDouble ; jrt->value_new_char = value_new_char ; jrt->value_getChar = value_getChar ; jrt->value_new_string = value_new_string ; jrt->value_getString = value_getString ; jrt->value_new_object = value_new_object ; jrt->value_getObject = value_getObject ; jrt->value_getException = value_getException ; jrt->object = object ; jrt->object_getClassName = object_getClassName ; jrt->java_object = java_object ; jrt->java_object_getClassName = java_object_getClassName ; jrt->java_object_getObject = java_object_getObject ; jrt->java_object_new = java_object_new ; jrt->exception = exception ; jrt->exception_getMessage = exception_getMessage ; jrt->java_exception = java_exception ; jrt->java_exception_getMessage = java_exception_getMessage ; jrt->java_exception_getValue = java_exception_getValue ; /* Initialize the java helper framework */ (*env)->CallStaticVoidMethod(env, utils, utils_setDebug, mlp_debug_level()) ; if (process_exception(ctx, jrt, env, MLP_RUNTIME_ERROR, "Can't call setDebug() method of class 'mlp/MLPUtils'")){ free(jrt) ; return NULL ; } return jrt ; } void *_mlp_java_runtime_new(mlp_context *ctx, mlp_language *lang){ JavaVMInitArgs vm_args ; vm_args.version = JNI_VERSION_1_2 ; vm_args.options = (JavaVMOption *)malloc(1 * sizeof(JavaVMOption)) ; vm_args.nOptions = 0 ; vm_args.ignoreUnrecognized = JNI_FALSE ; const char *classpath = getenv("CLASSPATH") ; const char *dir = mlp_language_get_dir(lang) ; if (classpath == NULL){ classpath = "" ; } char *cp = (char *)malloc((strlen(dir) + strlen(classpath) + 32) * sizeof(char)) ; sprintf(cp, "-Djava.class.path=%s:%s", dir, classpath) ; vm_args.options[vm_args.nOptions++].optionString = cp ; JavaVM *jvm = NULL ; JNIEnv *env = NULL ; jint res = JNI_CreateJavaVM(&jvm, (void **)&(env), &vm_args) ; if (res < 0) { mlp_context_set_error(ctx, MLP_RUNTIME_ERROR, "Can't create Java VM") ; return NULL ; } mlp_java_runtime *jrt = init_jrt(ctx, jvm, env) ; RETURN_NULL_IF_NULL(jrt) ; return (void *)jrt ; } void _mlp_java_runtime_delete(mlp_context *ctx, mlp_runtime *rt){ mlp_java_runtime *jrt = (mlp_java_runtime *)rt->runtime ; JavaVM *jvm = jrt->jvm ; mlp_debug(2, "Destroying JavaVM...") ; jint rc = (*jvm)->DestroyJavaVM(jvm) ; mlp_debug(3, "JavaVM destroyed") ; if (rc < 0){ mlp_context_set_error(ctx, MLP_RUNTIME_ERROR, "Error destroying Java VM") ; } free(rt->runtime) ; }