| | |
| | | |
| | | import android.content.Context; |
| | | |
| | | import java.lang.reflect.*; |
| | | |
| | | /** |
| | | SDL library initialization |
| | | */ |
| | |
| | | return mContext; |
| | | } |
| | | |
| | | public static void loadLibrary(String libraryName) throws UnsatisfiedLinkError, SecurityException, NullPointerException { |
| | | |
| | | if (libraryName == null) { |
| | | throw new NullPointerException("No library name provided."); |
| | | } |
| | | |
| | | try { |
| | | // Let's see if we have ReLinker available in the project. This is necessary for |
| | | // some projects that have huge numbers of local libraries bundled, and thus may |
| | | // trip a bug in Android's native library loader which ReLinker works around. (If |
| | | // loadLibrary works properly, ReLinker will simply use the normal Android method |
| | | // internally.) |
| | | // |
| | | // To use ReLinker, just add it as a dependency. For more information, see |
| | | // https://github.com/KeepSafe/ReLinker for ReLinker's repository. |
| | | // |
| | | Class relinkClass = mContext.getClassLoader().loadClass("com.getkeepsafe.relinker.ReLinker"); |
| | | Class relinkListenerClass = mContext.getClassLoader().loadClass("com.getkeepsafe.relinker.ReLinker$LoadListener"); |
| | | Class contextClass = mContext.getClassLoader().loadClass("android.content.Context"); |
| | | Class stringClass = mContext.getClassLoader().loadClass("java.lang.String"); |
| | | |
| | | // Get a 'force' instance of the ReLinker, so we can ensure libraries are reinstalled if |
| | | // they've changed during updates. |
| | | Method forceMethod = relinkClass.getDeclaredMethod("force"); |
| | | Object relinkInstance = forceMethod.invoke(null); |
| | | Class relinkInstanceClass = relinkInstance.getClass(); |
| | | |
| | | // Actually load the library! |
| | | Method loadMethod = relinkInstanceClass.getDeclaredMethod("loadLibrary", contextClass, stringClass, stringClass, relinkListenerClass); |
| | | loadMethod.invoke(relinkInstance, mContext, libraryName, null, null); |
| | | } |
| | | catch (final Throwable e) { |
| | | // Fall back |
| | | try { |
| | | System.loadLibrary(libraryName); |
| | | } |
| | | catch (final UnsatisfiedLinkError ule) { |
| | | throw ule; |
| | | } |
| | | catch (final SecurityException se) { |
| | | throw se; |
| | | } |
| | | } |
| | | } |
| | | |
| | | protected static Context mContext; |
| | | } |