1
0
Fork 0

Now the jvm for bdj is loaded using dlopen.

This commit is contained in:
Will07c5 2010-07-06 15:46:03 -05:00
parent 42c005e0d5
commit 24996a2996
4 changed files with 41 additions and 31 deletions

View File

@ -176,27 +176,19 @@ if [[ $use_bdjava = "yes" ]]; then
esac
BDJAVA_CFLAGS="-I${JDK_HOME}/include -I${JDK_HOME}/include/$java_os"
BDJAVA_LDFLAGS="-L${JDK_HOME}/jre/lib/$java_arch -L${JDK_HOME}/jre/lib/$java_arch/server"
echo "$BDJAVA_CFLAGS"
temp_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$BDJAVA_CFLAGS $CPPFLAGS"
AC_CHECK_HEADERS([jni.h], [], [AC_MSG_ERROR("Could not find jni.h")])
CPPFLAGS="$temp_CPPFLAGS"
temp_LDFLAGS="$LDFLAGS"
LDFLAGS="$BDJAVA_LDFLAGS $LDFLAGS"
AC_CHECK_LIB([jvm], [JNI_CreateJavaVM], [], [AC_MSG_ERROR("Could not find jvm library.")])
LDFLAGS="$temp_LDFLAGS"
AC_DEFINE([USING_BDJAVA], [1], ["Define to 1 if using BD-Java"])
AC_DEFINE_UNQUOTED([JAVA_ARCH], ["$java_arch"], ["Defines the architecture of the java vm."])
fi
AM_CONDITIONAL([USING_BDJAVA], [ test $use_bdjava = "yes" ])
# generate output files
AC_SUBST(BDJAVA_CFLAGS)
AC_SUBST(BDJAVA_LDFLAGS)
AC_SUBST(DLOPEN_LDFLAGS)
AC_SUBST(SET_WARNINGS)
AC_SUBST(SET_OPTIMIZATIONS)

View File

@ -74,7 +74,6 @@ libbluray_la_LDFLAGS= -version-info $(LIB_VERSION_INFO) $(LIBBLURAY_LDFLAGS)
if USING_BDJAVA
libbluray_la_SOURCES+=$(SOURCES_bdj)
libbluray_la_LDFLAGS+=@BDJAVA_LDFLAGS@
AM_CFLAGS+=@BDJAVA_CFLAGS@
all-local:

View File

@ -22,53 +22,44 @@ bdsplice_SOURCES = \
bdsplice.c
bdsplice_LDADD = $(BLURAY_LIB)
bdsplice_LDFLAGS = @BDJAVA_LDFLAGS@
mpls_dump_SOURCES = \
mpls_dump.c util.c util.h ../util/strutl.c
mpls_dump_LDADD = $(BLURAY_LIB_STATIC)
mpls_dump_LDFLAGS = @BDJAVA_LDFLAGS@
clpi_dump_SOURCES = \
clpi_dump.c util.c util.h
clpi_dump_LDADD = $(BLURAY_LIB_STATIC)
clpi_dump_LDFLAGS = @BDJAVA_LDFLAGS@
sound_dump_SOURCES = \
sound_dump.c
sound_dump_LDADD = $(BLURAY_LIB_STATIC)
sound_dump_LDFLAGS = @BDJAVA_LDFLAGS@
index_dump_SOURCES = \
index_dump.c
index_dump_LDADD = $(BLURAY_LIB_STATIC)
index_dump_LDFLAGS = @BDJAVA_LDFLAGS@
mobj_dump_SOURCES = \
mobj_dump.c
mobj_dump_LDADD = $(BLURAY_LIB_STATIC)
mobj_dump_LDFLAGS = @BDJAVA_LDFLAGS@
libbluray_test_SOURCES = \
libbluray_test.c ../util/logging.c
libbluray_test_LDADD = $(BLURAY_LIB)
libbluray_test_LDFLAGS = @BDJAVA_LDFLAGS@
list_titles_SOURCES = \
list_titles.c ../util/logging.c
list_titles_LDADD = $(BLURAY_LIB)
list_titles_LDFLAGS = @BDJAVA_LDFLAGS@
if USING_BDJAVA
noinst_PROGRAMS+= bdj_test
bdj_test_SOURCES = bdj_test.c
bdj_test_LDADD = $(BLURAY_LIB)
bdj_test_LDFLAGS = @BDJAVA_LDFLAGS@
endif

View File

@ -19,32 +19,40 @@
#include "bdj.h"
#if HAVE_CONFIG_H
#include "config.h"
#endif
#include "bdj_private.h"
#include "bdjo_parser.h"
#include "common.h"
#include "libbluray/register.h"
#include "file/dl.h"
#include "util/strutl.h"
#include <jni.h>
#include <stdlib.h>
#include <string.h>
typedef jint (*JNICALL fptr_JNI_CreateJavaVM)(JavaVM **pvm, void **penv, void *args);
int start_xlet(JNIEnv* env, BDJO_APP_INFO* info, BDJAVA* bdjava);
void* load_jvm();
BDJAVA* bdj_open(const char *path, const char* start, void* registers)
{
BDJAVA* bdjava = malloc(sizeof(BDJAVA));
// first load the jvm using dlopen
void* jvm_lib = load_jvm();
if (!jvm_lib)
return NULL;
BDJAVA* bdjava = malloc(sizeof(BDJAVA));
bdjava->reg = registers;
// determine path of bdjo file to load
char* bdjo_path = malloc(strlen(path) + strlen(BDJ_BDJO_PATH) + strlen(start) + 7);
sprintf(bdjo_path, "%s%s/%s.bdjo", path, BDJ_BDJO_PATH, start);
char* bdjo_path = str_printf("%s%s/%s.bdjo", path, BDJ_BDJO_PATH, start);
BDJO* bdjo = bdjo_read(bdjo_path);
free(bdjo_path);
if (bdjo != NULL && bdjo->app_info_count > 0) {
// for now just pick the first application in the bdjo
@ -54,15 +62,13 @@ BDJAVA* bdj_open(const char *path, const char* start, void* registers)
// check if overriding the classpath
const char* classpath = getenv("LIBBLURAY_CP");
if (strlen(classpath) == 0)
if (classpath == NULL)
classpath = BDJ_CLASSPATH;
// determine classpath
char* classpath_opt = malloc(strlen(path)*2 + strlen(BDJ_BDJO_PATH) +
strlen(app_info.base_directory) + strlen(BDJ_JAR_PATH) +
strlen(app_info.classpath_extension) + strlen(classpath) + 30);
sprintf(classpath_opt, "-Djava.class.path=%s:%s%s/%s.jar:%s%s%s.jar", classpath, path, BDJ_JAR_PATH,
app_info.base_directory, path, BDJ_JAR_PATH, app_info.classpath_extension);
char* classpath_opt = str_printf("-Djava.class.path=%s:%s%s/%s.jar:%s%s%s.jar",
classpath, path, BDJ_JAR_PATH, app_info.base_directory, path,
BDJ_JAR_PATH, app_info.classpath_extension);
JavaVMOption* option = malloc(sizeof(JavaVMOption)*1);
option[0].optionString = classpath_opt;
@ -72,7 +78,16 @@ BDJAVA* bdj_open(const char *path, const char* start, void* registers)
args.options = option;
args.ignoreUnrecognized = JNI_FALSE; // don't ignore unrecognized options
int result = JNI_CreateJavaVM(&bdjava->jvm, (void**)&bdjava->env, &args);
fptr_JNI_CreateJavaVM JNI_CreateJavaVM_fp = dl_dlsym(jvm_lib, "JNI_CreateJavaVM");
if (JNI_CreateJavaVM_fp == NULL) {
free(bdjava);
free(option);
free(classpath_opt);
return NULL;
}
int result = JNI_CreateJavaVM_fp(&bdjava->jvm, (void**)&bdjava->env, &args);
free(option);
free(classpath_opt);
@ -136,3 +151,16 @@ int start_xlet(JNIEnv* env, BDJO_APP_INFO* info, BDJAVA* bdjava)
return BDJ_SUCCESS;
}
void* load_jvm()
{
const char* java_home = getenv("JAVA_HOME");
if (java_home == NULL) {
DEBUG(DBG_CRIT, "JAVA_HOME not set, can't find Java VM.\n");
return NULL;
}
char* path = str_printf("%s/jre/lib/%s/server/libjvm", java_home, JAVA_ARCH);
return dl_dlopen(path, NULL);
}