static void launch_jvm_in_proc(mrb_state *mrb, CreateJavaVM_t *createJavaVM, char *java_main_class, char **java_opts, int java_optsc, char **ruby_opts, int ruby_optsc) { int i; JavaVM *jvm; JNIEnv *env; JavaVMInitArgs jvm_init_args; JavaVMOption jvm_opts[java_optsc]; for (i = 0; i < java_optsc; i++) { jvm_opts[i].extraInfo = 0; jvm_opts[i].optionString = java_opts[i]; if (strcmp("-client", jvm_opts[i].optionString) == 0) { mrb_raise(mrb, E_ARGUMENT_ERROR, "-client is not a valid option"); } else if (strcmp("-server", jvm_opts[i].optionString) == 0) { mrb_raise(mrb, E_ARGUMENT_ERROR, "-server is not a valid option"); } } jvm_init_args.options = jvm_opts; jvm_init_args.nOptions = java_optsc; jvm_init_args.version = JNI_VERSION_1_4; jvm_init_args.ignoreUnrecognized = JNI_FALSE; if (createJavaVM(&jvm, (void**)&env, &jvm_init_args) < 0) { mrb_raise(mrb, E_RUNTIME_ERROR, "JVM creation failed"); } jclass main_class = (*env)->FindClass(env, java_main_class); if (!main_class) { mrb_raise(mrb, E_ARGUMENT_ERROR, java_main_class); } jmethodID main_method = (*env)->GetStaticMethodID(env, main_class, "main", "([Ljava/lang/String;)V"); if (!main_method) { mrb_raise(mrb, E_ARGUMENT_ERROR, "Cannot get main method."); } jclass j_class_string = (*env)->FindClass(env, "java/lang/String"); jstring j_string_arg = (*env)->NewStringUTF(env, ""); jobjectArray main_args = (*env)->NewObjectArray(env, ruby_optsc, j_class_string, j_string_arg); for (i = 0; i < ruby_optsc; i++) { jstring j_string_arg = (*env)->NewStringUTF(env, ruby_opts[i]); if (!j_string_arg) { mrb_raise(mrb, E_ARGUMENT_ERROR, "NewStringUTF() failed"); } (*env)->SetObjectArrayElement(env, main_args, i, j_string_arg); } (*env)->CallStaticVoidMethod(env, main_class, main_method, main_args); if (env && (*env)->ExceptionOccurred(env)) { (*env)->ExceptionDescribe(env); } (*jvm)->DestroyJavaVM(jvm); }
/* * Class: VM_JNIFunctions * Method: createJavaVM * Signature: ()I */ extern "C" JNIEXPORT jint JNICALL Java_com_ibm_JikesRVM_jni_VM_1JNIFunctions_createJavaVM(JNIEnv *, jclass) { return createJavaVM(); }