diff options
author | Sven Gothel <[email protected]> | 2013-10-01 13:16:59 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2013-10-01 13:16:59 +0200 |
commit | 4aa1478b2e4f1401b08d093461b37a14c9501c29 (patch) | |
tree | e609e8ad9633b69d431753650ec73080c2e11682 /src/java/com/jogamp/common/util/JarUtil.java | |
parent | 1a8d2c627dbab5234aea72a458c00b6bba28add0 (diff) |
Bug 845: Add support for one big-fat jar file [java classes plus all native 'os.and.arch' libraries]
JNILibLoaderBase.addNativeJarLibsImpl(..):
If the modules's jar file contains the folder 'natives/<os.and.arch>/'
we assume a big-fat jar and attempt to load all native libraries from the same.
The test for above folder is performed via the class ClassLoader's getResource(..)
and is considered inexpensive.
If the folder exists and native libraries could be loaded, the method returns successfull.
Otherwise, the 'slim' jar file is attempted to be loaded, even if such folder exist.
Diffstat (limited to 'src/java/com/jogamp/common/util/JarUtil.java')
-rw-r--r-- | src/java/com/jogamp/common/util/JarUtil.java | 39 |
1 files changed, 29 insertions, 10 deletions
diff --git a/src/java/com/jogamp/common/util/JarUtil.java b/src/java/com/jogamp/common/util/JarUtil.java index 41d68d4..665e196 100644 --- a/src/java/com/jogamp/common/util/JarUtil.java +++ b/src/java/com/jogamp/common/util/JarUtil.java @@ -514,22 +514,23 @@ public class JarUtil { * @param dest * @param nativeLibMap * @param jarFile - * @param deepDirectoryTraversal + * @param nativeLibraryPath if not null, only extracts native libraries within this path. * @param extractNativeLibraries * @param extractClassFiles * @param extractOtherFiles + * @param deepDirectoryTraversal * @return * @throws IOException */ public static final int extract(File dest, Map<String, String> nativeLibMap, JarFile jarFile, + String nativeLibraryPath, boolean extractNativeLibraries, - boolean extractClassFiles, - boolean extractOtherFiles) throws IOException { + boolean extractClassFiles, boolean extractOtherFiles) throws IOException { if (DEBUG) { System.err.println("JarUtil: extract: "+jarFile.getName()+" -> "+dest+ - ", extractNativeLibraries "+extractNativeLibraries+ + ", extractNativeLibraries "+extractNativeLibraries+" ("+nativeLibraryPath+")"+ ", extractClassFiles "+extractClassFiles+ ", extractOtherFiles "+extractOtherFiles); } @@ -543,11 +544,29 @@ public class JarUtil { // Match entries with correct prefix and suffix (ignoring case) final String libBaseName = NativeLibrary.isValidNativeLibraryName(entryName, false); final boolean isNativeLib = null != libBaseName; - if(isNativeLib && !extractNativeLibraries) { - if (DEBUG) { - System.err.println("JarUtil: JarEntry : " + entryName + " native-lib skipped"); + if(isNativeLib) { + if(!extractNativeLibraries) { + if (DEBUG) { + System.err.println("JarUtil: JarEntry : " + entryName + " native-lib skipped, skip all native libs"); + } + continue; + } + if(null != nativeLibraryPath) { + final String nativeLibraryPathS; + final String dirnameS; + try { + nativeLibraryPathS = IOUtil.slashify(nativeLibraryPath, false /* startWithSlash */, true /* endWithSlash */); + dirnameS = IOUtil.getDirname(entryName); + } catch (URISyntaxException e) { + throw new IOException(e); + } + if( !nativeLibraryPathS.equals(dirnameS) ) { + if (DEBUG) { + System.err.println("JarUtil: JarEntry : " + entryName + " native-lib skipped, not in path: "+nativeLibraryPathS); + } + continue; + } } - continue; } final boolean isClassFile = entryName.endsWith(".class"); @@ -581,14 +600,14 @@ public class JarUtil { if (DEBUG) { System.err.println("JarUtil: MKDIR: " + entryName + " -> " + destFile ); } - destFile.mkdir(); + destFile.mkdirs(); } else { final File destFolder = new File(destFile.getParent()); if(!destFolder.exists()) { if (DEBUG) { System.err.println("JarUtil: MKDIR (parent): " + entryName + " -> " + destFolder ); } - destFolder.mkdir(); + destFolder.mkdirs(); } final InputStream in = new BufferedInputStream(jarFile.getInputStream(entry)); final OutputStream out = new BufferedOutputStream(new FileOutputStream(destFile)); |