From e6068b5b15a2b014b60e70470fe7bdbebc5ba2d4 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Mon, 22 Oct 2018 14:55:45 -0700 Subject: [PATCH] Handle failure to load hidapi gracefully --- .../java/org/libsdl/app/HIDDeviceManager.java | 31 +++++++++++++++++-- .../app/src/main/java/org/libsdl/app/SDL.java | 2 +- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/android-project/app/src/main/java/org/libsdl/app/HIDDeviceManager.java b/android-project/app/src/main/java/org/libsdl/app/HIDDeviceManager.java index 761ecca0d39b9..db9400f6d6574 100644 --- a/android-project/app/src/main/java/org/libsdl/app/HIDDeviceManager.java +++ b/android-project/app/src/main/java/org/libsdl/app/HIDDeviceManager.java @@ -1,5 +1,7 @@ package org.libsdl.app; +import android.app.Activity; +import android.app.AlertDialog; import android.app.PendingIntent; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; @@ -8,6 +10,7 @@ import android.util.Log; import android.content.BroadcastReceiver; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; @@ -98,17 +101,39 @@ public void onReceive(Context context, Intent intent) { } }; - private HIDDeviceManager(Context context) { + private HIDDeviceManager(final Context context) { mContext = context; // Make sure we have the HIDAPI library loaded with the native functions try { SDL.loadLibrary("hidapi"); - } catch (Exception e) { + } catch (Throwable e) { Log.w(TAG, "Couldn't load hidapi: " + e.toString()); + + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setCancelable(false); + builder.setTitle("SDL HIDAPI Error"); + builder.setMessage("Please report the following error to the SDL maintainers: " + e.getMessage()); + builder.setNegativeButton("Quit", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + try { + // If our context is an activity, exit rather than crashing when we can't + // call our native functions. + Activity activity = (Activity)context; + + activity.finish(); + } + catch (ClassCastException cce) { + // Context wasn't an activity, there's nothing we can do. Give up and return. + } + } + }); + builder.show(); + return; } - + HIDDeviceRegisterCallback(); mSharedPreferences = mContext.getSharedPreferences("hidapi", Context.MODE_PRIVATE); diff --git a/android-project/app/src/main/java/org/libsdl/app/SDL.java b/android-project/app/src/main/java/org/libsdl/app/SDL.java index 58597c6555f51..fb7f7319a8979 100644 --- a/android-project/app/src/main/java/org/libsdl/app/SDL.java +++ b/android-project/app/src/main/java/org/libsdl/app/SDL.java @@ -66,7 +66,7 @@ public static void loadLibrary(String libraryName) throws UnsatisfiedLinkError, Method loadMethod = relinkInstanceClass.getDeclaredMethod("loadLibrary", contextClass, stringClass, stringClass, relinkListenerClass); loadMethod.invoke(relinkInstance, mContext, libraryName, null, null); } - catch (final Exception e) { + catch (final Throwable e) { // Fall back try { System.loadLibrary(libraryName);