Skip to content

Commit

Permalink
Allow SDL to use ReLinker if present.
Browse files Browse the repository at this point in the history
This fixes issues for applications that have a large number of shared libraries
For more information, see https://github.com/KeepSafe/ReLinker for ReLinker's repository.
  • Loading branch information
slouken committed Oct 4, 2018
1 parent 41ee51b commit a0c5366
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 5 deletions.
Expand Up @@ -577,7 +577,7 @@ public int sendFeatureReport(byte[] report) {
}

// We need to skip the first byte, as that doesn't go over the air
byte[] actual_report = Arrays.copyOfRange(report, 1, report.length - 1);
byte[] actual_report = Arrays.copyOfRange(report, 1, report.length - 1);
//Log.v(TAG, "sendFeatureReport " + HexDump.dumpHexString(actual_report));
writeCharacteristic(reportCharacteristic, actual_report);
return report.length;
Expand Down
Expand Up @@ -80,14 +80,14 @@ public void onReceive(Context context, Intent intent) {
public HIDDeviceManager(Context context) {
mContext = context;

// Make sure we have the HIDAPI library loaded with the native functions
// Make sure we have the HIDAPI library loaded with the native functions
try {
System.loadLibrary("hidapi");
SDL.loadLibrary("hidapi");
} catch (Exception e) {
Log.w(TAG, "Couldn't load hidapi: " + e.toString());
return;
}

HIDDeviceRegisterCallback(this);

mSharedPreferences = mContext.getSharedPreferences("hidapi", Context.MODE_PRIVATE);
Expand Down
47 changes: 47 additions & 0 deletions android-project/app/src/main/java/org/libsdl/app/SDL.java
Expand Up @@ -2,6 +2,8 @@

import android.content.Context;

import java.lang.reflect.*;

/**
SDL library initialization
*/
Expand Down Expand Up @@ -33,5 +35,50 @@ public static Context getContext() {
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 Exception e) {
// Fall back
try {
System.loadLibrary(libraryName);
}
catch (final UnsatisfiedLinkError ule) {
throw ule;
}
catch (final SecurityException se) {
throw se;
}
}
}

protected static Context mContext;
}
Expand Up @@ -154,7 +154,7 @@ protected String[] getLibraries() {
// Load the .so
public void loadLibraries() {
for (String lib : getLibraries()) {
System.loadLibrary(lib);
SDL.loadLibrary(lib);
}
}

Expand Down

0 comments on commit a0c5366

Please sign in to comment.