Browse Source

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)

shadowislord 10 năm trước cách đây
mục cha
commit
3991123073

+ 37 - 5
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()});
                 }
             }