libbluray | branch: master | hpi1 <[email protected]> | Wed Sep 26 13:11:56 2012 +0300| [8f3eb2ee110d8c1b6012e706027c228f0fb6ccfb] | committer: hpi1
Fixed threading issues in C<->Java interface (merge from dslibbluray) > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=8f3eb2ee110d8c1b6012e706027c228f0fb6ccfb --- src/libbluray/bdj/bdj.c | 48 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/src/libbluray/bdj/bdj.c b/src/libbluray/bdj/bdj.c index 149cf3b..8d7f64f 100644 --- a/src/libbluray/bdj/bdj.c +++ b/src/libbluray/bdj/bdj.c @@ -149,22 +149,33 @@ BDJAVA* bdj_open(const char *path, int bdj_start(BDJAVA *bdjava, unsigned title) { - JNIEnv* env = bdjava->env; + JNIEnv* env; + int attach = 0; jboolean status = JNI_FALSE; jclass loader_class; jmethodID load_id; + if ((*bdjava->jvm)->GetEnv(bdjava->jvm, (void**)&env, JNI_VERSION_1_6) != JNI_OK) { + (*bdjava->jvm)->AttachCurrentThread(bdjava->jvm, (void**)&env, NULL); + attach = 1; + } + if (bdj_get_method(env, &loader_class, &load_id, "org/videolan/BDJLoader", "load", "(I)Z")) { status = (*env)->CallStaticBooleanMethod(env, loader_class, load_id, (jint)title); } + if (attach) { + (*bdjava->jvm)->DetachCurrentThread(bdjava->jvm); + } + return (status == JNI_TRUE) ? BDJ_SUCCESS : BDJ_ERROR; } int bdj_stop(BDJAVA *bdjava) { - JNIEnv* env = bdjava->env; + JNIEnv *env; + int attach; jboolean status = JNI_FALSE; jclass loader_class; jmethodID unload_id; @@ -173,17 +184,27 @@ int bdj_stop(BDJAVA *bdjava) return BDJ_ERROR; } + if ((*bdjava->jvm)->GetEnv(bdjava->jvm, (void**)&env, JNI_VERSION_1_6) != JNI_OK) { + (*bdjava->jvm)->AttachCurrentThread(bdjava->jvm, (void**)&env, NULL); + attach = 1; + } + if (bdj_get_method(env, &loader_class, &unload_id, "org/videolan/BDJLoader", "unload", "()Z")) { status = (*env)->CallStaticBooleanMethod(env, loader_class, unload_id); } + if (attach) { + (*bdjava->jvm)->DetachCurrentThread(bdjava->jvm); + } + return (status == JNI_TRUE) ? BDJ_SUCCESS : BDJ_ERROR; } void bdj_close(BDJAVA *bdjava) { - JNIEnv* env = bdjava->env; + JNIEnv *env; + int attach; jclass shutdown_class; jmethodID shutdown_id; @@ -191,11 +212,20 @@ void bdj_close(BDJAVA *bdjava) return; } + if ((*bdjava->jvm)->GetEnv(bdjava->jvm, (void**)&env, JNI_VERSION_1_6) != JNI_OK) { + (*bdjava->jvm)->AttachCurrentThread(bdjava->jvm, (void**)&env, NULL); + attach = 1; + } + if (bdj_get_method(env, &shutdown_class, &shutdown_id, "org/videolan/Libbluray", "shutdown", "()V")) { (*env)->CallStaticVoidMethod(env, shutdown_class, shutdown_id); } + if (attach) { + (*bdjava->jvm)->DetachCurrentThread(bdjava->jvm); + } + (*bdjava->jvm)->DestroyJavaVM(bdjava->jvm); free(bdjava); @@ -203,12 +233,22 @@ void bdj_close(BDJAVA *bdjava) void bdj_process_event(BDJAVA *bdjava, unsigned ev, unsigned param) { - JNIEnv* env = bdjava->env; + JNIEnv* env; + int attach = 0; jclass event_class; jmethodID event_id; + if ((*bdjava->jvm)->GetEnv(bdjava->jvm, (void**)&env, JNI_VERSION_1_6) != JNI_OK) { + (*bdjava->jvm)->AttachCurrentThread(bdjava->jvm, (void**)&env, NULL); + attach = 1; + } + if (bdj_get_method(env, &event_class, &event_id, "org/videolan/Libbluray", "processEvent", "(II)V")) { (*env)->CallStaticVoidMethod(env, event_class, event_id, ev, param); } + + if (attach) { + (*bdjava->jvm)->DetachCurrentThread(bdjava->jvm); + } } _______________________________________________ libbluray-devel mailing list [email protected] http://mailman.videolan.org/listinfo/libbluray-devel
