NativeLibraryLoader: Don't load LWJGL / JInput when they are not found in classpath

* LWJGL / JInput have their own loading mechanism which works fine when they are in java.library.path (e.g. when bundling)
experimental
shadowislord 10 years ago
parent e923f9e0d9
commit 3991123073
  1. 42
      jme3-desktop/src/main/java/com/jme3/system/NativeLibraryLoader.java

@ -316,6 +316,32 @@ public final class NativeLibraryLoader {
}
}
/**
* Removes platform-specific portions of a library file name so
* that it can be accepted by {@link System#loadLibrary(java.lang.String) }.
* <p>
* E.g.<br>
* <ul>
* <li>jinput-dx8_64.dll => jinput-dx8_64</li>
* <li>liblwjgl64.so => lwjgl64</li>
* <li>libopenal.so => openal</li>
* </ul>
*
* @param filename The filename to strip platform-specific parts
* @return The stripped library name
*/
private static String unmapLibraryName(String filename) {
StringBuilder sb = new StringBuilder(filename);
if (sb.indexOf("lib") == 0 && !filename.toLowerCase().endsWith(".dll")) {
sb.delete(0, 3);
}
int dot = sb.lastIndexOf(".");
if (dot > 0) {
sb.delete(dot, sb.length());
}
return sb.toString();
}
public static File getJarForNativeLibrary(Platform platform, String name) {
NativeLibrary library = nativeLibraryMap.get(new NativeLibrary.Key(name, platform));
if (library == null) {
@ -482,21 +508,27 @@ public final class NativeLibraryLoader {
if (url == null) {
// Attempt to load it as a system library.
String unmappedName = unmapLibraryName(fileNameInJar);
try {
System.loadLibrary(name);
logger.log(Level.FINE, "Loaded system installed " +
"version of native library: {0}", name);
// XXX: HACK. Vary loading method based on library name..
// lwjgl and jinput handle loading by themselves.
if (!name.equals("lwjgl") && !name.equals("jinput")) {
// Need to unmap it from library specific parts.
System.loadLibrary(unmappedName);
logger.log(Level.FINE, "Loaded system installed "
+ "version of native library: {0}", unmappedName);
}
} catch (UnsatisfiedLinkError e) {
if (isRequired) {
throw new UnsatisfiedLinkError(
"The required native library '" + name + "'"
"The required native library '" + unmappedName + "'"
+ " was not found in the classpath via '" + pathInJar
+ "'. Error message: " + e.getMessage());
} else {
logger.log(Level.FINE, "The optional native library ''{0}''" +
" was not found in the classpath via ''{1}''" +
". Error message: {2}",
new Object[]{name, pathInJar, e.getMessage()});
new Object[]{unmappedName, pathInJar, e.getMessage()});
}
}

Loading…
Cancel
Save