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 0cf398a3f..2d8788237 100644 --- a/jme3-desktop/src/main/java/com/jme3/system/NativeLibraryLoader.java +++ b/jme3-desktop/src/main/java/com/jme3/system/NativeLibraryLoader.java @@ -40,6 +40,7 @@ import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.util.HashMap; +import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; @@ -278,6 +279,106 @@ public final class NativeLibraryLoader { } } } + + public static void extractNativeLibraries(Platform platform, File targetDir) throws IOException { + for (Map.Entry lib : nativeLibraryMap.entrySet()) { + if (lib.getValue().getPlatform() == platform) { + if (!targetDir.exists()) { + targetDir.mkdirs(); + } + extractNativeLibrary(platform, lib.getValue().getName(), targetDir); + } + } + } + + private static String mapLibraryName_emulated(String name, Platform platform) { + switch (platform) { + case MacOSX32: + case MacOSX64: + return name + ".dylib"; + case Windows32: + case Windows64: + return name + ".dll"; + default: + return name + ".so"; + } + } + + public static void extractNativeLibrary(Platform platform, String name, File extractionDir) throws IOException { + NativeLibrary library = nativeLibraryMap.get(new NativeLibrary.Key(name, platform)); + if (library == null) { + return; + } + + String pathInJar = library.getPathInNativesJar(); + if (pathInJar == null) { + return; + } + + String fileNameInJar; + if (pathInJar.contains("/")) { + fileNameInJar = pathInJar.substring(pathInJar.lastIndexOf("/") + 1); + } else { + fileNameInJar = pathInJar; + } + + URL url = Thread.currentThread().getContextClassLoader().getResource(pathInJar); + if (url == null) { + url = Thread.currentThread().getContextClassLoader().getResource(fileNameInJar); + } + + if (url == null) { + return; + } + + 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; + } else { + loadedAsFileName = fileNameInJar; + } + + URLConnection conn = url.openConnection(); + InputStream in = conn.getInputStream(); + + File targetFile = new File(extractionDir, loadedAsFileName); + OutputStream out = null; + try { + out = new FileOutputStream(targetFile); + int len; + while ((len = in.read(buf)) > 0) { + out.write(buf, 0, len); + } + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException ex) { + } + } + if (out != null) { + try { + out.close(); + } catch (IOException ex) { + } + } + } + } /** * First extracts the native library and then loads it.