Now the jvm for bdj is loaded using dlopen.
This commit is contained in:
parent
42c005e0d5
commit
24996a2996
10
configure.ac
10
configure.ac
|
@ -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)
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue