From: Tobias Brunner Date: Tue, 7 Aug 2012 11:34:44 +0000 (+0200) Subject: Don't attach to actual Java threads (or already attached ones) X-Git-Tag: 5.0.1~210^2~67 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=95e9a12c2898f74486275b1031dc70dc2cb2f998;p=thirdparty%2Fstrongswan.git Don't attach to actual Java threads (or already attached ones) We check this by trying to retrieve a JNIEnv object from the JVM, if one is returned the current thread is not native (created from Java) or the thread is already attached. --- diff --git a/src/frontends/android/jni/libandroidbridge/android_jni.c b/src/frontends/android/jni/libandroidbridge/android_jni.c index 0acebbbcd3..b5e935a574 100644 --- a/src/frontends/android/jni/libandroidbridge/android_jni.c +++ b/src/frontends/android/jni/libandroidbridge/android_jni.c @@ -46,6 +46,11 @@ static void attached_thread_cleanup(void *arg) */ void androidjni_attach_thread(JNIEnv **env) { + if ((*android_jvm)->GetEnv(android_jvm, (void**)env, + JNI_VERSION_1_6) == JNI_OK) + { /* already attached or even a Java thread */ + return; + } (*android_jvm)->AttachCurrentThread(android_jvm, env, NULL); /* use a thread-local value with a destructor that automatically detaches * the thread from the JVM before it terminates, if not done manually */ @@ -57,8 +62,11 @@ void androidjni_attach_thread(JNIEnv **env) */ void androidjni_detach_thread() { - androidjni_threadlocal->set(androidjni_threadlocal, NULL); - (*android_jvm)->DetachCurrentThread(android_jvm); + if (androidjni_threadlocal->get(androidjni_threadlocal)) + { /* only do this if we actually attached this thread */ + androidjni_threadlocal->set(androidjni_threadlocal, NULL); + (*android_jvm)->DetachCurrentThread(android_jvm); + } } /** @@ -85,7 +93,8 @@ jint JNI_OnLoad(JavaVM *vm, void *reserved) } /** - * Called when this library is unloaded by the JVM + * Called when this library is unloaded by the JVM (which never happens on + * Android) */ void JNI_OnUnload(JavaVM *vm, void *reserved) {