libbluray | branch: master | hpi1 <[email protected]> | Tue Feb 25 15:14:38 2014 +0200| [af991675912b31f176a72e5a57856236d0022e93] | committer: hpi1
bdj: unregister native functions at close > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=af991675912b31f176a72e5a57856236d0022e93 --- src/libbluray/bdj/bdj.c | 2 ++ src/libbluray/bdj/bdj_util.c | 32 ++++++++++++++++++++++++++++ src/libbluray/bdj/bdj_util.h | 1 + src/libbluray/bdj/native/register_native.c | 8 +++++++ src/libbluray/bdj/native/register_native.h | 1 + 5 files changed, 44 insertions(+) diff --git a/src/libbluray/bdj/bdj.c b/src/libbluray/bdj/bdj.c index 842950c..83b6790 100644 --- a/src/libbluray/bdj/bdj.c +++ b/src/libbluray/bdj/bdj.c @@ -491,6 +491,8 @@ void bdj_close(BDJAVA *bdjava) (*env)->DeleteLocalRef(env, shutdown_class); } + bdj_unregister_native_methods(env); + if (attach) { (*bdjava->jvm)->DetachCurrentThread(bdjava->jvm); } diff --git a/src/libbluray/bdj/bdj_util.c b/src/libbluray/bdj/bdj_util.c index c1b7fb1..35178e0 100644 --- a/src/libbluray/bdj/bdj_util.c +++ b/src/libbluray/bdj/bdj_util.c @@ -104,3 +104,35 @@ int bdj_register_methods(JNIEnv *env, const char *class_name, return !error; } + +int bdj_unregister_methods(JNIEnv *env, const char *class_name) +{ + jclass cls; + int error; + + (*env)->ExceptionClear(env); + + cls = (*env)->FindClass(env, class_name); + + if (!cls) { + BD_DEBUG(DBG_BDJ | DBG_CRIT, "Failed to locate class %s\n", class_name); + (*env)->ExceptionDescribe(env); + (*env)->ExceptionClear(env); + return 0; + } + + error = (*env)->UnregisterNatives(env, cls); + + if ((*env)->ExceptionOccurred(env)) { + BD_DEBUG(DBG_BDJ | DBG_CRIT, "Failed to unregister native methods for class %s\n", class_name); + (*env)->ExceptionDescribe(env); + (*env)->ExceptionClear(env); + return 0; + } + + if (error) { + BD_DEBUG(DBG_BDJ | DBG_CRIT, "Failed to runegister native methods for class %s\n", class_name); + } + + return !error; +} diff --git a/src/libbluray/bdj/bdj_util.h b/src/libbluray/bdj/bdj_util.h index fa28188..25fd64a 100644 --- a/src/libbluray/bdj/bdj_util.h +++ b/src/libbluray/bdj/bdj_util.h @@ -38,5 +38,6 @@ BD_PRIVATE int bdj_get_method(JNIEnv *env, jclass *cls, jmethodID *method_id, // register native methods for class BD_PRIVATE int bdj_register_methods(JNIEnv *env, const char *class_name, const JNINativeMethod *methods, int methods_count); +BD_PRIVATE int bdj_unregister_methods(JNIEnv *env, const char *class_name); #endif diff --git a/src/libbluray/bdj/native/register_native.c b/src/libbluray/bdj/native/register_native.c index 5803d56..18e72ce 100644 --- a/src/libbluray/bdj/native/register_native.c +++ b/src/libbluray/bdj/native/register_native.c @@ -51,3 +51,11 @@ int bdj_register_native_methods(JNIEnv *env) Java_java_awt_BDGraphics_methods_count) ; } + +void bdj_unregister_native_methods(JNIEnv *env) +{ + bdj_unregister_methods(env, "java/awt/BDGraphics"); + bdj_unregister_methods(env, "java/awt/BDFontMetrics"); + bdj_unregister_methods(env, "org/videolan/Libbluray"); + bdj_unregister_methods(env, "org/videolan/Logger"); +} diff --git a/src/libbluray/bdj/native/register_native.h b/src/libbluray/bdj/native/register_native.h index d326598..1077384 100644 --- a/src/libbluray/bdj/native/register_native.h +++ b/src/libbluray/bdj/native/register_native.h @@ -25,5 +25,6 @@ #include <jni.h> BD_PRIVATE int bdj_register_native_methods(JNIEnv *env); +BD_PRIVATE void bdj_unregister_native_methods(JNIEnv *env); #endif /* _REGISTER_NATIVE_H_ */ _______________________________________________ libbluray-devel mailing list [email protected] https://mailman.videolan.org/listinfo/libbluray-devel
