Don't attach to actual Java threads (or already attached ones)
authorTobias Brunner <tobias@strongswan.org>
Tue, 7 Aug 2012 11:34:44 +0000 (13:34 +0200)
committerTobias Brunner <tobias@strongswan.org>
Mon, 13 Aug 2012 09:00:25 +0000 (11:00 +0200)
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.

src/frontends/android/jni/libandroidbridge/android_jni.c

index 0acebbb..b5e935a 100644 (file)
@@ -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)
 {