static int _create_jvm(void *jvm_lib, const char *java_home, const char *jar_file, JNIEnv **env, JavaVM **jvm) { (void)java_home; /* used only with J2ME */ fptr_JNI_CreateJavaVM JNI_CreateJavaVM_fp = (fptr_JNI_CreateJavaVM)(intptr_t)dl_dlsym(jvm_lib, "JNI_CreateJavaVM"); if (JNI_CreateJavaVM_fp == NULL) { BD_DEBUG(DBG_BDJ | DBG_CRIT, "Couldn't find symbol JNI_CreateJavaVM.\n"); return 0; } JavaVMOption* option = calloc(1, sizeof(JavaVMOption) * 20); int n = 0; JavaVMInitArgs args; option[n++].optionString = str_dup ("-Dawt.toolkit=java.awt.BDToolkit"); option[n++].optionString = str_dup ("-Djava.awt.graphicsenv=java.awt.BDGraphicsEnvironment"); option[n++].optionString = str_printf("-Xbootclasspath/p:%s", jar_file); option[n++].optionString = str_dup ("-Xms256M"); option[n++].optionString = str_dup ("-Xmx256M"); option[n++].optionString = str_dup ("-Xss2048k"); #ifdef HAVE_BDJ_J2ME option[n++].optionString = str_printf("-Djava.home=%s", java_home); option[n++].optionString = str_printf("-Xbootclasspath/a:%s/lib/xmlparser.jar", java_home); option[n++].optionString = str_dup ("-XfullShutdown"); #endif /* JVM debug options */ if (getenv("BDJ_JVM_DEBUG")) { option[n++].optionString = str_dup("-ea"); //option[n++].optionString = str_dup("-verbose"); //option[n++].optionString = str_dup("-verbose:class,gc,jni"); option[n++].optionString = str_dup("-Xdebug"); option[n++].optionString = str_dup("-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"); } #ifdef HAVE_BDJ_J2ME /* see: http://docs.oracle.com/javame/config/cdc/cdc-opt-impl/ojmeec/1.0/runtime/html/cvm.htm#CACBHBJB trace method execution: BDJ_JVM_TRACE=0x0002 trace exceptions: BDJ_JVM_TRACE=0x4000 */ if (getenv("BDJ_JVM_TRACE")) { option[n++].optionString = str_printf("-Xtrace:%s", getenv("BDJ_JVM_TRACE")); } #endif args.version = JNI_VERSION_1_4; args.nOptions = n; args.options = option; args.ignoreUnrecognized = JNI_FALSE; // don't ignore unrecognized options int result = JNI_CreateJavaVM_fp(jvm, (void**) env, &args); while (--n >= 0) { X_FREE(option[n].optionString); } X_FREE(option); if (result != JNI_OK || !*env) { BD_DEBUG(DBG_BDJ | DBG_CRIT, "Failed to create new Java VM. JNI_CreateJavaVM result: %d\n", result); return 0; } return 1; }
static int _create_jvm(void *jvm_lib, const char *java_home, const char *jar_file, JNIEnv **env, JavaVM **jvm) { (void)java_home; /* used only with J2ME */ fptr_JNI_CreateJavaVM JNI_CreateJavaVM_fp; *(void **)(&JNI_CreateJavaVM_fp) = dl_dlsym(jvm_lib, "JNI_CreateJavaVM"); if (JNI_CreateJavaVM_fp == NULL) { BD_DEBUG(DBG_BDJ | DBG_CRIT, "Couldn't find symbol JNI_CreateJavaVM.\n"); return 0; } JavaVMOption* option = calloc(1, sizeof(JavaVMOption) * 20); if (!option) { BD_DEBUG(DBG_CRIT, "out of memory\n"); return 0; } int n = 0; JavaVMInitArgs args; option[n++].optionString = str_dup ("-Dawt.toolkit=java.awt.BDToolkit"); option[n++].optionString = str_dup ("-Djava.awt.graphicsenv=java.awt.BDGraphicsEnvironment"); option[n++].optionString = str_dup ("-Djavax.accessibility.assistive_technologies= "); option[n++].optionString = str_printf("-Xbootclasspath/p:%s", jar_file); option[n++].optionString = str_dup ("-Xms256M"); option[n++].optionString = str_dup ("-Xmx256M"); option[n++].optionString = str_dup ("-Xss2048k"); #ifdef HAVE_BDJ_J2ME option[n++].optionString = str_printf("-Djava.home=%s", java_home); option[n++].optionString = str_printf("-Xbootclasspath/a:%s/lib/xmlparser.jar", java_home); option[n++].optionString = str_dup ("-XfullShutdown"); #endif /* JVM debug options */ if (getenv("BDJ_JVM_DEBUG")) { option[n++].optionString = str_dup("-ea"); //option[n++].optionString = str_dup("-verbose"); //option[n++].optionString = str_dup("-verbose:class,gc,jni"); option[n++].optionString = str_dup("-Xdebug"); option[n++].optionString = str_dup("-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"); } #ifdef HAVE_BDJ_J2ME /* see: http://docs.oracle.com/javame/config/cdc/cdc-opt-impl/ojmeec/1.0/runtime/html/cvm.htm#CACBHBJB trace method execution: BDJ_JVM_TRACE=0x0002 trace exceptions: BDJ_JVM_TRACE=0x4000 */ if (getenv("BDJ_JVM_TRACE")) { option[n++].optionString = str_printf("-Xtrace:%s", getenv("BDJ_JVM_TRACE")); } #endif args.version = JNI_VERSION_1_4; args.nOptions = n; args.options = option; args.ignoreUnrecognized = JNI_FALSE; // don't ignore unrecognized options #ifdef _WIN32 /* ... in windows, JVM options are not UTF8 but current system code page ... */ /* luckily, most BD-J options can be passed in as java strings later. But, not class path. */ int ii; for (ii = 0; ii < n; ii++) { char *tmp = _utf8_to_cp(option[ii].optionString); if (tmp) { X_FREE(option[ii].optionString); option[ii].optionString = tmp; } else { BD_DEBUG(DBG_BDJ | DBG_CRIT, "Failed to convert %s\n", option[ii].optionString); } } #endif int result = JNI_CreateJavaVM_fp(jvm, (void**) env, &args); while (--n >= 0) { X_FREE(option[n].optionString); } X_FREE(option); if (result != JNI_OK || !*env) { BD_DEBUG(DBG_BDJ | DBG_CRIT, "Failed to create new Java VM. JNI_CreateJavaVM result: %d\n", result); return 0; } return 1; }
BDJAVA* bdj_open(const char *path, struct bluray *bd, struct bd_registers_s *registers, struct indx_root_s *index) { // first load the jvm using dlopen void* jvm_lib = _load_jvm(); if (!jvm_lib) { BD_DEBUG(DBG_BDJ | DBG_CRIT, "Wasn't able to load libjvm.so\n"); return NULL; } fptr_JNI_CreateJavaVM JNI_CreateJavaVM_fp = (fptr_JNI_CreateJavaVM)dl_dlsym(jvm_lib, "JNI_CreateJavaVM"); if (JNI_CreateJavaVM_fp == NULL) { dl_dlclose(jvm_lib); BD_DEBUG(DBG_BDJ | DBG_CRIT, "Couldn't find symbol JNI_CreateJavaVM.\n"); return NULL; } BDJAVA* bdjava = calloc(1, sizeof(BDJAVA)); bdjava->bd = bd; bdjava->reg = registers; bdjava->index = index; bdjava->path = path; bdjava->h_libjvm = jvm_lib; JavaVMInitArgs args; // check if overriding the classpath const char* classpath = getenv("LIBBLURAY_CP"); if (classpath == NULL) classpath = BDJ_CLASSPATH; // determine classpath char* classpath_opt = str_printf("-Djava.class.path=%s", classpath); // determine bluray.vfs.root char* vfs_opt; vfs_opt = str_printf("-Dbluray.vfs.root=%s", path); JavaVMOption* option = calloc(1, sizeof(JavaVMOption) * 9); int n = 0; option[n++].optionString = classpath_opt; option[n++].optionString = vfs_opt; args.version = JNI_VERSION_1_6; args.nOptions = n; args.options = option; args.ignoreUnrecognized = JNI_FALSE; // don't ignore unrecognized options JNIEnv* env = NULL; int result = JNI_CreateJavaVM_fp(&bdjava->jvm, (void**) &env, &args); free(option); free(classpath_opt); free(vfs_opt); if (result != JNI_OK || !env) { bdj_close(bdjava); BD_DEBUG(DBG_BDJ | DBG_CRIT, "Failed to create new Java VM.\n"); return NULL; } if (!_bdj_init(bdjava, env)) { bdj_close(bdjava); return NULL; } return bdjava; }
BDJAVA* bdj_open(const char *path, const char* start, void* bd, void* registers) { // first load the jvm using dlopen void* jvm_lib = load_jvm(); if (!jvm_lib) { BD_DEBUG(DBG_BDJ | DBG_CRIT, "Wasn't able to load libjvm.so\n"); return NULL; } BDJAVA* bdjava = malloc(sizeof(BDJAVA)); bdjava->bd = bd; bdjava->reg = registers; JavaVMInitArgs args; // check if overriding the classpath const char* classpath = getenv("LIBBLURAY_CP"); if (classpath == NULL) classpath = BDJ_CLASSPATH; // determine classpath char* classpath_opt = str_printf("-Djava.class.path=%s", classpath); JavaVMOption* option = malloc(sizeof(JavaVMOption) * 1); option[0].optionString = classpath_opt; args.version = JNI_VERSION_1_6; args.nOptions = 1; args.options = option; args.ignoreUnrecognized = JNI_FALSE; // don't ignore unrecognized options fptr_JNI_CreateJavaVM JNI_CreateJavaVM_fp = (fptr_JNI_CreateJavaVM)dl_dlsym(jvm_lib, "JNI_CreateJavaVM"); if (JNI_CreateJavaVM_fp == NULL) { free(bdjava); free(option); free(classpath_opt); BD_DEBUG(DBG_BDJ | DBG_CRIT, "Couldn't find symbol JNI_CreateJavaVM.\n"); return NULL; } int result = JNI_CreateJavaVM_fp(&bdjava->jvm, (void**) &bdjava->env, &args); free(option); free(classpath_opt); if (result != JNI_OK || !bdjava->env) { free(bdjava); BD_DEBUG(DBG_BDJ | DBG_CRIT, "Failed to create new Java VM.\n"); return NULL; } // determine path of bdjo file to load char* bdjo_path = str_printf("%s%s/%s.bdjo", path, BDJ_BDJO_PATH, start); jobject bdjo = bdjo_read(bdjava->env, bdjo_path); free(bdjo_path); if (!bdjo) { free(bdjava); BD_DEBUG(DBG_BDJ | DBG_CRIT, "Failed to load BDJO file.\n"); return NULL; } if (start_xlet(bdjava->env, path, bdjo, bdjava) == BDJ_ERROR) { free(bdjava); BD_DEBUG(DBG_BDJ | DBG_CRIT, "Failed to start BDJ program.\n"); return NULL; } return bdjava; }