diff --git a/jme3-desktop/src/main/java/com/jme3/system/NativeLibraryLoader.java b/jme3-desktop/src/main/java/com/jme3/system/NativeLibraryLoader.java
index 1ea33fd5e..f23273257 100644
--- a/jme3-desktop/src/main/java/com/jme3/system/NativeLibraryLoader.java
+++ b/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) }.
+ *
+ * E.g.
+ *
+ * - jinput-dx8_64.dll => jinput-dx8_64
+ * - liblwjgl64.so => lwjgl64
+ * - libopenal.so => openal
+ *
+ *
+ * @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()});
}
}