JNIEXPORT jobject JNICALL Java_org_videolan_Libbluray_getBdjoN(JNIEnv * env, jclass cls, jlong np, jstring name) { BDJAVA* bdj = (BDJAVA*)(intptr_t)np; const char *bdjo_name = (*env)->GetStringUTFChars(env, name, NULL);; char* bdjo_path = str_printf("%s%s/%s.bdjo", bdj->path, BDJ_BDJO_PATH, bdjo_name); (*env)->ReleaseStringUTFChars(env, name, bdjo_name); jobject bdjo = bdjo_read(env, bdjo_path); X_FREE(bdjo_path); return bdjo; }
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; }