# HG changeset patch # User Paul Hunkin # Date 1280218822 -7200 # Node ID 9bb98766eed0f4796cdf979067bc02eb009e73e0 # Parent 0f05f2f16fadcaf8c3563f5991e02f0039845166 Shut down the C application properly on quit instead of crashing in the most horrible way possible diff -r 0f05f2f16fad -r 9bb98766eed0 android/testproject/jni/app-android.cpp --- a/android/testproject/jni/app-android.cpp Tue Jul 27 09:58:17 2010 +0200 +++ b/android/testproject/jni/app-android.cpp Tue Jul 27 10:20:22 2010 +0200 @@ -38,22 +38,29 @@ extern "C" int SDL_main(); extern "C" int Android_OnKeyDown(int keycode); extern "C" int Android_OnKeyUp(int keycode); +extern "C" int SDL_SendQuit(); + +//If we're not the active app, don't try to render +bool bRenderingEnabled = false; /******************************************************************************* Functions called by JNI *******************************************************************************/ -extern "C" void Java_org_libsdl_android_SDLActivity_nativeInit( JNIEnv* env, jobject obj ) -{ - __android_log_print(ANDROID_LOG_INFO, "SDL", "JNI: NativeInit"); +extern "C" void Java_org_libsdl_android_SDLActivity_nativeInit( JNIEnv* env, + jobject obj ){ + + __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: Native Init"); mEnv = env; + bRenderingEnabled = true; + SDL_main(); } -extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved) -{ +extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved){ + JNIEnv* env = NULL; jint result = -1; @@ -85,6 +92,7 @@ int r = Android_OnKeyDown(keycode); __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: native key down %d, %d\n", keycode, r); + } extern "C" void Java_org_libsdl_android_SDLActivity_onNativeKeyUp(JNIEnv* env, @@ -93,13 +101,28 @@ int r = Android_OnKeyUp(keycode); __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: native key up %d, %d\n", keycode, r); + } extern "C" void Java_org_libsdl_android_SDLActivity_onNativeTouch(JNIEnv* env, jobject obj, jint action, jfloat x, jfloat y, jfloat p){ + __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: native touch event %d @ %f/%f, pressure %f\n", action, x, y, p); + +} + +extern "C" void Java_org_libsdl_android_SDLActivity_nativeQuit( JNIEnv* env, + jobject obj ){ + + //Stop rendering as we're no longer in the foreground + bRenderingEnabled = false; + + //Inject a SDL_QUIT event + int r = SDL_SendQuit(); + + __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: Native quit %d", r); } @@ -110,17 +133,18 @@ extern "C" void sdl_create_context(){ __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: sdl_create_context()\n"); + bRenderingEnabled = true; + mEnv->CallStaticVoidMethod(mActivityInstance, midCreateGLContext ); - __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: sdl_create_context() return\n"); - - // exit(1); } extern "C" void sdl_render(){ - //When we get here, we've accumulated a full frame - //__android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: sdl_render()"); - + if(!bRenderingEnabled){ + return; + } + + //When we get here, we've accumulated a full frame mEnv->CallStaticVoidMethod(mActivityInstance, midFlipBuffers ); } diff -r 0f05f2f16fad -r 9bb98766eed0 android/testproject/jni/lesson05.c --- a/android/testproject/jni/lesson05.c Tue Jul 27 09:58:17 2010 +0200 +++ b/android/testproject/jni/lesson05.c Tue Jul 27 10:20:22 2010 +0200 @@ -348,7 +348,7 @@ } } - + rotation++; return( TRUE ); } @@ -463,6 +463,7 @@ case SDL_QUIT: /* handle quit requests */ done = TRUE; + __android_log_print(ANDROID_LOG_INFO, "SDL","App is shutting down\n"); break; default: break; diff -r 0f05f2f16fad -r 9bb98766eed0 android/testproject/src/org/libsdl/android/SDLActivity.java --- a/android/testproject/src/org/libsdl/android/SDLActivity.java Tue Jul 27 09:58:17 2010 +0200 +++ b/android/testproject/src/org/libsdl/android/SDLActivity.java Tue Jul 27 10:20:22 2010 +0200 @@ -61,6 +61,7 @@ //C functions we call public static native void nativeInit(); + public static native void nativeQuit(); public static native void onNativeKeyDown(int keycode); public static native void onNativeKeyUp(int keycode); public static native void onNativeTouch(int action, float x, @@ -69,7 +70,6 @@ - //Java functions called from C private static void createGLContext(){ mSurface.initEGL(); @@ -139,6 +139,8 @@ //Called when we lose the surface public void surfaceDestroyed(SurfaceHolder holder) { Log.v("SDL","Surface destroyed"); + + SDLActivity.nativeQuit(); } //Called when the surface is resized