From 34a85f4de66a96fb198c6fce9964ee994a6c25ca Mon Sep 17 00:00:00 2001 From: Gabriel Jacobo Date: Tue, 21 Oct 2014 11:44:35 -0300 Subject: [PATCH] [Android] #2759: Show a message on failure to load a .so library (by Sylvain) --- .../src/org/libsdl/app/SDLActivity.java | 83 +++++++++++++++++-- 1 file changed, 76 insertions(+), 7 deletions(-) diff --git a/android-project/src/org/libsdl/app/SDLActivity.java b/android-project/src/org/libsdl/app/SDLActivity.java index f850bf527..6e1ff076c 100644 --- a/android-project/src/org/libsdl/app/SDLActivity.java +++ b/android-project/src/org/libsdl/app/SDLActivity.java @@ -37,6 +37,7 @@ public class SDLActivity extends Activity { // Keep track of the paused state public static boolean mIsPaused, mIsSurfaceReady, mHasFocus; public static boolean mExitCalledFromJava; + public static boolean mBrokenLibraries; // Main components protected static SDLActivity mSingleton; @@ -52,13 +53,19 @@ public class SDLActivity extends Activity { protected static AudioTrack mAudioTrack; // Load the .so - static { - System.loadLibrary("SDL2"); - //System.loadLibrary("SDL2_image"); - //System.loadLibrary("SDL2_mixer"); - //System.loadLibrary("SDL2_net"); - //System.loadLibrary("SDL2_ttf"); - System.loadLibrary("main"); + public void loadLibraries() { + String AppLibraries[] = { + "SDL2", + // "SDL2_image", + // "SDL2_mixer", + // "SDL2_net", + // "SDL2_ttf", + "main" + }; + + for (String lib : AppLibraries) { + System.loadLibrary(lib); + } } /** @@ -83,6 +90,7 @@ public class SDLActivity extends Activity { mSDLThread = null; mAudioTrack = null; mExitCalledFromJava = false; + mBrokenLibraries = false; mIsPaused = false; mIsSurfaceReady = false; mHasFocus = true; @@ -98,6 +106,35 @@ public class SDLActivity extends Activity { // So we can call stuff from static callbacks mSingleton = this; + // Load shared libraries + try { + loadLibraries(); + } catch(UnsatisfiedLinkError e) { + System.out.println(e.getMessage()); + mBrokenLibraries = true; + } catch(Exception e) { + System.out.println(e.getMessage()); + mBrokenLibraries = true; + } + + if (mBrokenLibraries) + { + AlertDialog.Builder dlgAlert = new AlertDialog.Builder(this); + dlgAlert.setMessage("An error occurred while try to start the application. Please try again and/or reinstall."); + dlgAlert.setTitle("SDL Error"); + dlgAlert.setPositiveButton("EXIT", + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog,int id) { + // if this button is clicked, close current activity + SDLActivity.mSingleton.finish(); + } + }); + dlgAlert.setCancelable(true); + dlgAlert.create().show(); + + return; + } + // Set up the surface mSurface = new SDLSurface(getApplication()); @@ -119,6 +156,11 @@ public class SDLActivity extends Activity { protected void onPause() { Log.v("SDL", "onPause()"); super.onPause(); + + if (SDLActivity.mBrokenLibraries) { + return; + } + SDLActivity.handlePause(); } @@ -126,6 +168,11 @@ public class SDLActivity extends Activity { protected void onResume() { Log.v("SDL", "onResume()"); super.onResume(); + + if (SDLActivity.mBrokenLibraries) { + return; + } + SDLActivity.handleResume(); } @@ -135,6 +182,10 @@ public class SDLActivity extends Activity { super.onWindowFocusChanged(hasFocus); Log.v("SDL", "onWindowFocusChanged(): " + hasFocus); + if (SDLActivity.mBrokenLibraries) { + return; + } + SDLActivity.mHasFocus = hasFocus; if (hasFocus) { SDLActivity.handleResume(); @@ -145,12 +196,25 @@ public class SDLActivity extends Activity { public void onLowMemory() { Log.v("SDL", "onLowMemory()"); super.onLowMemory(); + + if (SDLActivity.mBrokenLibraries) { + return; + } + SDLActivity.nativeLowMemory(); } @Override protected void onDestroy() { Log.v("SDL", "onDestroy()"); + + if (SDLActivity.mBrokenLibraries) { + super.onDestroy(); + // Reset everything in case the user re opens the app + SDLActivity.initialize(); + return; + } + // Send a quit message to the application SDLActivity.mExitCalledFromJava = true; SDLActivity.nativeQuit(); @@ -174,6 +238,11 @@ public class SDLActivity extends Activity { @Override public boolean dispatchKeyEvent(KeyEvent event) { + + if (SDLActivity.mBrokenLibraries) { + return false; + } + int keyCode = event.getKeyCode(); // Ignore certain special keys so they're handled by Android if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN ||