Skip to content

Commit

Permalink
Associate the environment with any thread that calls Android_JNI_GetE…
Browse files Browse the repository at this point in the history
…nv(), in case it's been manually created with pthread_create() or C++11.
  • Loading branch information
slouken committed Dec 7, 2013
1 parent 44afc2a commit 5e656f8
Showing 1 changed file with 13 additions and 11 deletions.
24 changes: 13 additions & 11 deletions src/core/android/SDL_android.c
Expand Up @@ -98,12 +98,10 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved)
* Create mThreadKey so we can keep track of the JNIEnv assigned to each thread
* Refer to http://developer.android.com/guide/practices/design/jni.html for the rationale behind this
*/
if (pthread_key_create(&mThreadKey, Android_JNI_ThreadDestroyed)) {
if (pthread_key_create(&mThreadKey, Android_JNI_ThreadDestroyed) != 0) {
__android_log_print(ANDROID_LOG_ERROR, "SDL", "Error initializing pthread key");
}
else {
Android_JNI_SetupThread();
}
Android_JNI_SetupThread();

return JNI_VERSION_1_4;
}
Expand Down Expand Up @@ -454,7 +452,8 @@ SDL_bool Android_JNI_GetAccelerometerValues(float values[3])
return retval;
}

static void Android_JNI_ThreadDestroyed(void* value) {
static void Android_JNI_ThreadDestroyed(void* value)
{
/* The thread is being destroyed, detach it from the Java VM and set the mThreadKey value to NULL as required */
JNIEnv *env = (JNIEnv*) value;
if (env != NULL) {
Expand All @@ -463,7 +462,8 @@ static void Android_JNI_ThreadDestroyed(void* value) {
}
}

JNIEnv* Android_JNI_GetEnv(void) {
JNIEnv* Android_JNI_GetEnv(void)
{
/* From http://developer.android.com/guide/practices/jni.html
* All threads are Linux threads, scheduled by the kernel.
* They're usually started from managed code (using Thread.start), but they can also be created elsewhere and then
Expand All @@ -483,10 +483,6 @@ JNIEnv* Android_JNI_GetEnv(void) {
return 0;
}

return env;
}

int Android_JNI_SetupThread(void) {
/* From http://developer.android.com/guide/practices/jni.html
* Threads attached through JNI must call DetachCurrentThread before they exit. If coding this directly is awkward,
* in Android 2.0 (Eclair) and higher you can use pthread_key_create to define a destructor function that will be
Expand All @@ -496,8 +492,14 @@ int Android_JNI_SetupThread(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)
*/
JNIEnv *env = Android_JNI_GetEnv();
pthread_setspecific(mThreadKey, (void*) env);

return env;
}

int Android_JNI_SetupThread(void)
{
Android_JNI_GetEnv();
return 1;
}

Expand Down

0 comments on commit 5e656f8

Please sign in to comment.