From 77d2d55e1ea50c61fe87e8a476d8abe45cc8c60a Mon Sep 17 00:00:00 2001 From: Gabriel Jacobo Date: Thu, 5 Dec 2013 10:51:38 -0300 Subject: [PATCH] [Android] Handle native thread finishing when not commanded from the Java side --- .../src/org/libsdl/app/SDLActivity.java | 27 +++++++++++++++++++ test/controllermap.c | 4 --- test/testjoystick.c | 5 ---- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/android-project/src/org/libsdl/app/SDLActivity.java b/android-project/src/org/libsdl/app/SDLActivity.java index 966d23639..045130efb 100644 --- a/android-project/src/org/libsdl/app/SDLActivity.java +++ b/android-project/src/org/libsdl/app/SDLActivity.java @@ -26,6 +26,7 @@ public class SDLActivity extends Activity { // Keep track of the paused state public static boolean mIsPaused = false, mIsSurfaceReady = false, mHasFocus = true; + public static boolean mExitCalledFromJava; // Main components protected static SDLActivity mSingleton; @@ -63,6 +64,9 @@ public class SDLActivity extends Activity { // Set up the surface mSurface = new SDLSurface(getApplication()); + // Make sure this variable is initialized here! + mExitCalledFromJava = false; + if(Build.VERSION.SDK_INT >= 12) { mJoystickHandler = new SDLJoystickHandler_API12(); } @@ -115,6 +119,7 @@ public class SDLActivity extends Activity { super.onDestroy(); Log.v("SDL", "onDestroy()"); // Send a quit message to the application + SDLActivity.mExitCalledFromJava = true; SDLActivity.nativeQuit(); // Now wait for the SDL thread to quit @@ -168,6 +173,12 @@ public class SDLActivity extends Activity { mSurface.enableSensor(Sensor.TYPE_ACCELEROMETER, true); } } + + /* The native thread has finished */ + public static void handleNativeExit() { + SDLActivity.mSDLThread = null; + mSingleton.finish(); + } // Messages from the SDLMain thread @@ -616,6 +627,22 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback, SDLActivity.mSDLThread = new Thread(new SDLMain(), "SDLThread"); enableSensor(Sensor.TYPE_ACCELEROMETER, true); SDLActivity.mSDLThread.start(); + + // Set up a listener thread to catch when the native thread ends + new Thread(new Runnable(){ + public void run(){ + try { + SDLActivity.mSDLThread.join(); + } + catch(Exception e){} + finally{ + // Native thread has finished + if (! SDLActivity.mExitCalledFromJava) { + SDLActivity.handleNativeExit(); + } + } + } + }).start(); } } diff --git a/test/controllermap.c b/test/controllermap.c index dc943cb80..c17f17c39 100644 --- a/test/controllermap.c +++ b/test/controllermap.c @@ -425,11 +425,7 @@ main(int argc, char *argv[]) } SDL_QuitSubSystem(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK); -#ifdef ANDROID - exit(0); -#else return 0; -#endif } #else diff --git a/test/testjoystick.c b/test/testjoystick.c index 7d3c573df..d9db6e8ea 100644 --- a/test/testjoystick.c +++ b/test/testjoystick.c @@ -287,11 +287,6 @@ main(int argc, char *argv[]) } SDL_QuitSubSystem(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK); -#ifdef ANDROID - exit(0); -#else - return 0; -#endif } #else