From b9aa3768aca1a7c89031de743f9c4b344ce78e1f Mon Sep 17 00:00:00 2001 From: Sylvain Becker Date: Sun, 20 Jan 2019 22:11:56 +0100 Subject: [PATCH] Android: automatically attach to the JVM non-SDL threads It allows a thread created with pthread_create() to access the JNI Env --- src/core/android/SDL_android.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/core/android/SDL_android.c b/src/core/android/SDL_android.c index c3b6cff00..b17893502 100644 --- a/src/core/android/SDL_android.c +++ b/src/core/android/SDL_android.c @@ -331,7 +331,27 @@ JNIEnv* Android_JNI_GetEnv(void) /* Get JNIEnv from the Thread local storage */ JNIEnv *env = pthread_getspecific(mThreadKey); if (env == NULL) { - __android_log_print(ANDROID_LOG_ERROR, "SDL", "JNIEnv is NULL. Call Android_JNI_SetupThread() first."); + /* If it fails, try to attach ! (e.g the thread isn't * created with SDL_CreateThread() */ + int status; + + /* There should be a JVM */ + if (mJavaVM == NULL) { + __android_log_print(ANDROID_LOG_ERROR, "SDL", "Failed, there is no JavaVM"); + return 0; + } + + /* Attach the current thread to the JVM and get a JNIEnv. + * It will be detached by pthread_create destructor 'Android_JNI_ThreadDestroyed' */ + status = (*mJavaVM)->AttachCurrentThread(mJavaVM, &env, NULL); + if (status < 0) { + __android_log_print(ANDROID_LOG_ERROR, "SDL", "Failed to attach current thread (err=%d)", status); + return NULL; + } + + /* Save JNIEnv into the Thread local storage */ + if (Android_JNI_SetEnv(env) < 0) { + return NULL; + } } return env;