From 8f9dfcc7c1281cc53d0c96f83837e3cd6321cad1 Mon Sep 17 00:00:00 2001 From: shadowislord Date: Tue, 27 Jan 2015 21:10:32 -0500 Subject: [PATCH] NativeLibraryLoader: Allow specifying the filename that the extracted library should have (needed for certain workarounds..) --- .../java/com/jme3/system/NativeLibrary.java | 21 +++--- .../com/jme3/system/NativeLibraryLoader.java | 71 +++++-------------- 2 files changed, 32 insertions(+), 60 deletions(-) diff --git a/jme3-desktop/src/main/java/com/jme3/system/NativeLibrary.java b/jme3-desktop/src/main/java/com/jme3/system/NativeLibrary.java index 5ef77eec1..081cc6858 100644 --- a/jme3-desktop/src/main/java/com/jme3/system/NativeLibrary.java +++ b/jme3-desktop/src/main/java/com/jme3/system/NativeLibrary.java @@ -40,8 +40,8 @@ final class NativeLibrary { private final String name; private final Platform platform; - private final boolean isJNI; private final String pathInNativesJar; + private final String extractedAsFileName; /** * Key for map to find a library for a name and platform. @@ -98,12 +98,17 @@ final class NativeLibrary { } /** - * If this library is a JNI library. + * The filename that the library should be extracted as. * - * @return True if JNI library, false if native code (e.g. C/C++) library. + * In some cases can be different than {@link #getPathInNativesJar() path in natives jar}, + * since the names of the libraries specified in the jars are often incorrect. + * If set to null, then the same name as the filename in + * natives jar shall be used. + * + * @return the name that should be given to the extracted file. */ - public boolean isJNI() { - return isJNI; + public String getExtractedAsName() { + return extractedAsFileName; } /** @@ -121,17 +126,17 @@ final class NativeLibrary { /** * Create a new NativeLibrary. */ - public NativeLibrary(String name, Platform platform, String pathInNativesJar, boolean isJNI) { + public NativeLibrary(String name, Platform platform, String pathInNativesJar, String extractedAsFileName) { this.name = name; this.platform = platform; this.pathInNativesJar = pathInNativesJar; - this.isJNI = isJNI; + this.extractedAsFileName = extractedAsFileName; } /** * Create a new NativeLibrary. */ public NativeLibrary(String name, Platform platform, String pathInNativesJar) { - this(name, platform, pathInNativesJar, true); + this(name, platform, pathInNativesJar, null); } } 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 f23273257..bf41cd8a6 100644 --- a/jme3-desktop/src/main/java/com/jme3/system/NativeLibraryLoader.java +++ b/jme3-desktop/src/main/java/com/jme3/system/NativeLibraryLoader.java @@ -94,13 +94,13 @@ public final class NativeLibraryLoader { * @param path The path inside the natives-jar or classpath * corresponding to this library. Must be compatible with the platform * argument. - * @param isJNI True if this is a JNI library, false if this is a regular - * native (C/C++) library. + * @param extractAsName The filename that the library should be extracted as, + * if null, use the same name as in the path. */ public static void registerNativeLibrary(String name, Platform platform, - String path, boolean isJNI) { + String path, String extractAsName) { nativeLibraryMap.put(new NativeLibrary.Key(name, platform), - new NativeLibrary(name, platform, path, isJNI)); + new NativeLibrary(name, platform, path, extractAsName)); } /** @@ -121,7 +121,7 @@ public final class NativeLibraryLoader { */ public static void registerNativeLibrary(String name, Platform platform, String path) { - registerNativeLibrary(name, platform, path, true); + registerNativeLibrary(name, platform, path, null); } static { @@ -134,12 +134,13 @@ public final class NativeLibraryLoader { registerNativeLibrary("lwjgl", Platform.MacOSX64, "native/macosx/liblwjgl.dylib"); // OpenAL - registerNativeLibrary("openal", Platform.Windows32, "native/windows/OpenAL32.dll", false); - registerNativeLibrary("openal", Platform.Windows64, "native/windows/OpenAL64.dll", false); - registerNativeLibrary("openal", Platform.Linux32, "native/linux/libopenal.so", false); - registerNativeLibrary("openal", Platform.Linux64, "native/linux/libopenal64.so", false); - registerNativeLibrary("openal", Platform.MacOSX32, "native/macosx/openal.dylib", false); - registerNativeLibrary("openal", Platform.MacOSX64, "native/macosx/openal.dylib", false); + // For OSX: Need to add lib prefix when extracting + registerNativeLibrary("openal", Platform.Windows32, "native/windows/OpenAL32.dll"); + registerNativeLibrary("openal", Platform.Windows64, "native/windows/OpenAL64.dll"); + registerNativeLibrary("openal", Platform.Linux32, "native/linux/libopenal.so"); + registerNativeLibrary("openal", Platform.Linux64, "native/linux/libopenal64.so"); + registerNativeLibrary("openal", Platform.MacOSX32, "native/macosx/openal.dylib", "libopenal.dylib"); + registerNativeLibrary("openal", Platform.MacOSX64, "native/macosx/openal.dylib", "libopenal.dylib"); // BulletJme registerNativeLibrary("bulletjme", Platform.Windows32, "native/windows/x86/bulletjme.dll"); @@ -150,12 +151,13 @@ public final class NativeLibraryLoader { registerNativeLibrary("bulletjme", Platform.MacOSX64, "native/osx/x86_64/libbulletjme.dylib"); // JInput + // For OSX: Need to rename extension jnilib -> dylib when extracting registerNativeLibrary("jinput", Platform.Windows32, "native/windows/jinput-raw.dll"); registerNativeLibrary("jinput", Platform.Windows64, "native/windows/jinput-raw_64.dll"); registerNativeLibrary("jinput", Platform.Linux32, "native/windows/libjinput-linux.so"); registerNativeLibrary("jinput", Platform.Linux64, "native/windows/libjinput-linux64.so"); - registerNativeLibrary("jinput", Platform.MacOSX32, "native/macosx/libjinput-osx.jnilib"); - registerNativeLibrary("jinput", Platform.MacOSX64, "native/macosx/libjinput-osx.jnilib"); + registerNativeLibrary("jinput", Platform.MacOSX32, "native/macosx/libjinput-osx.jnilib", "libjinput-osx.dylib"); + registerNativeLibrary("jinput", Platform.MacOSX64, "native/macosx/libjinput-osx.jnilib", "libjinput-osx.dylib"); // JInput Auxiliary (only required on Windows) registerNativeLibrary("jinput-dx8", Platform.Windows32, "native/windows/jinput-dx8.dll"); @@ -407,23 +409,8 @@ public final class NativeLibraryLoader { } String loadedAsFileName; - if (library.isJNI()) { - String fileNameInJarWithoutExtension - = fileNameInJar.substring(0, fileNameInJar.lastIndexOf(".")); - -// if (platform.is64Bit() && !fileNameInJarWithoutExtension.endsWith("64")) { -// fileNameInJarWithoutExtension += "64"; -// } - - String systemJniExtension; - String dummyLib = mapLibraryName_emulated("", platform); - if (dummyLib.contains(".")) { - systemJniExtension = dummyLib.substring(dummyLib.lastIndexOf(".")); - } else { - systemJniExtension = ""; - } - - loadedAsFileName = fileNameInJarWithoutExtension + systemJniExtension; + if (library.getExtractedAsName() != null) { + loadedAsFileName = library.getExtractedAsName(); } else { loadedAsFileName = fileNameInJar; } @@ -538,29 +525,9 @@ public final class NativeLibraryLoader { // The library has been found and is ready to be extracted. // Determine what filename it should be extracted as. String loadedAsFileName; - if (library.isJNI()) { - // JNI libraries on Mac / JDK6 use jnilib extension. - // JNI libraries on Mac / JDK7 use dylib extension. - String fileNameInJarWithoutExtension - = fileNameInJar.substring(0, fileNameInJar.lastIndexOf(".")); - -// if (platform.is64Bit() && !fileNameInJarWithoutExtension.endsWith("64")) { -// // This is to avoid conflicts with 32-bit versions of the -// // same library when extracting. -// fileNameInJarWithoutExtension += "64"; -// } - - String systemJniExtension; - String dummyLib = System.mapLibraryName(""); - if (dummyLib.contains(".")) { - systemJniExtension = dummyLib.substring(dummyLib.lastIndexOf(".")); - } else { - systemJniExtension = ""; - } - - loadedAsFileName = fileNameInJarWithoutExtension + systemJniExtension; + if (library.getExtractedAsName() != null) { + loadedAsFileName = library.getExtractedAsName(); } else { - // Not a JNI library. // Just use the original filename as it is in the JAR. loadedAsFileName = fileNameInJar; }