|
|
@ -40,6 +40,7 @@ import java.net.MalformedURLException; |
|
|
|
import java.net.URL; |
|
|
|
import java.net.URL; |
|
|
|
import java.net.URLConnection; |
|
|
|
import java.net.URLConnection; |
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.HashMap; |
|
|
|
|
|
|
|
import java.util.HashSet; |
|
|
|
import java.util.Map; |
|
|
|
import java.util.Map; |
|
|
|
import java.util.logging.Level; |
|
|
|
import java.util.logging.Level; |
|
|
|
import java.util.logging.Logger; |
|
|
|
import java.util.logging.Logger; |
|
|
@ -280,6 +281,17 @@ public final class NativeLibraryLoader { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static File[] getJarsWithNatives() { |
|
|
|
|
|
|
|
HashSet<File> jarFiles = new HashSet<File>(); |
|
|
|
|
|
|
|
for (Map.Entry<NativeLibrary.Key, NativeLibrary> lib : nativeLibraryMap.entrySet()) { |
|
|
|
|
|
|
|
File jarFile = getJarForNativeLibrary(lib.getValue().getPlatform(), lib.getValue().getName()); |
|
|
|
|
|
|
|
if (jarFile != null) { |
|
|
|
|
|
|
|
jarFiles.add(jarFile); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return jarFiles.toArray(new File[0]); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public static void extractNativeLibraries(Platform platform, File targetDir) throws IOException { |
|
|
|
public static void extractNativeLibraries(Platform platform, File targetDir) throws IOException { |
|
|
|
for (Map.Entry<NativeLibrary.Key, NativeLibrary> lib : nativeLibraryMap.entrySet()) { |
|
|
|
for (Map.Entry<NativeLibrary.Key, NativeLibrary> lib : nativeLibraryMap.entrySet()) { |
|
|
|
if (lib.getValue().getPlatform() == platform) { |
|
|
|
if (lib.getValue().getPlatform() == platform) { |
|
|
@ -304,7 +316,44 @@ public final class NativeLibraryLoader { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public static void extractNativeLibrary(Platform platform, String name, File extractionDir) throws IOException { |
|
|
|
public static File getJarForNativeLibrary(Platform platform, String name) { |
|
|
|
|
|
|
|
NativeLibrary library = nativeLibraryMap.get(new NativeLibrary.Key(name, platform)); |
|
|
|
|
|
|
|
if (library == null) { |
|
|
|
|
|
|
|
return null; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
String pathInJar = library.getPathInNativesJar(); |
|
|
|
|
|
|
|
if (pathInJar == null) { |
|
|
|
|
|
|
|
return null; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 null; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
StringBuilder sb = new StringBuilder(url.toString()); |
|
|
|
|
|
|
|
if (sb.indexOf("jar:file:/") == 0) { |
|
|
|
|
|
|
|
sb.delete(0, 9); |
|
|
|
|
|
|
|
sb.delete(sb.indexOf("!"), sb.length()); |
|
|
|
|
|
|
|
return new File(sb.toString()); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
return null; // not a jar
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static void extractNativeLibrary(Platform platform, String name, File targetDir) throws IOException { |
|
|
|
NativeLibrary library = nativeLibraryMap.get(new NativeLibrary.Key(name, platform)); |
|
|
|
NativeLibrary library = nativeLibraryMap.get(new NativeLibrary.Key(name, platform)); |
|
|
|
if (library == null) { |
|
|
|
if (library == null) { |
|
|
|
return; |
|
|
|
return; |
|
|
@ -356,7 +405,7 @@ public final class NativeLibraryLoader { |
|
|
|
URLConnection conn = url.openConnection(); |
|
|
|
URLConnection conn = url.openConnection(); |
|
|
|
InputStream in = conn.getInputStream(); |
|
|
|
InputStream in = conn.getInputStream(); |
|
|
|
|
|
|
|
|
|
|
|
File targetFile = new File(extractionDir, loadedAsFileName); |
|
|
|
File targetFile = new File(targetDir, loadedAsFileName); |
|
|
|
OutputStream out = null; |
|
|
|
OutputStream out = null; |
|
|
|
try { |
|
|
|
try { |
|
|
|
out = new FileOutputStream(targetFile); |
|
|
|
out = new FileOutputStream(targetFile); |
|
|
|