From 9a98e5afe1ac5fd06e9d021344d8ea4b618c15b4 Mon Sep 17 00:00:00 2001 From: Sylvain Becker Date: Fri, 11 Jan 2019 14:50:43 +0100 Subject: [PATCH] Android: don't call Android_JNI_ThreadDestroyed() for Java SDLThread SDLThread is a Java Thread, it's not needed to call 'Detach' from the JVM. Clear mThreadKey, so that the pthread_create destructor is not called for this thread. --- src/core/android/SDL_android.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/core/android/SDL_android.c b/src/core/android/SDL_android.c index ffaec0bfc28a0..7a0cb5e9337fa 100644 --- a/src/core/android/SDL_android.c +++ b/src/core/android/SDL_android.c @@ -292,6 +292,9 @@ static SDL_bool bHasNewData; static SDL_bool bHasEnvironmentVariables = SDL_FALSE; + +static void Android_JNI_SetEnv(JNIEnv *env); + /******************************************************************************* Functions called by JNI *******************************************************************************/ @@ -559,6 +562,10 @@ JNIEXPORT int JNICALL SDL_JAVA_INTERFACE(nativeRunMain)(JNIEnv *env, jclass cls, } (*env)->ReleaseStringUTFChars(env, library, library_file); + /* This is a Java thread, it doesn't need to be Detached from the JVM. + * Set to mThreadKey value to NULL not to call pthread_create destructor 'Android_JNI_ThreadDestroyed' */ + Android_JNI_SetEnv(NULL); + /* Do not issue an exit or the whole application will terminate instead of just the SDL thread */ /* exit(status); */ @@ -1126,7 +1133,14 @@ static void Android_JNI_ThreadDestroyed(void *value) JNIEnv *env = (JNIEnv *) value; if (env != NULL) { (*mJavaVM)->DetachCurrentThread(mJavaVM); - pthread_setspecific(mThreadKey, NULL); + Android_JNI_SetEnv(NULL); + } +} + +static void Android_JNI_SetEnv(JNIEnv *env) { + int status = pthread_setspecific(mThreadKey, env); + if (status < 0) { + __android_log_print(ANDROID_LOG_ERROR, "SDL", "Failed pthread_setspecific() in Android_JNI_SetEnv() (err=%d)", status); } } @@ -1160,7 +1174,7 @@ JNIEnv* Android_JNI_GetEnv(void) * Note: You can call this function any number of times for the same thread, there's no harm in it * (except for some lost CPU cycles) */ - pthread_setspecific(mThreadKey, (void *)env); + Android_JNI_SetEnv(env); return env; }