diff options
-rwxr-xr-x | make/scripts/runtest.sh | 4 | ||||
-rw-r--r-- | src/java/com/jogamp/common/os/NativeLibrary.java | 83 | ||||
-rw-r--r-- | src/java/jogamp/common/os/PlatformPropsImpl.java | 2 | ||||
-rw-r--r-- | src/junit/com/jogamp/common/os/TestElfReader01.java | 2 |
4 files changed, 82 insertions, 9 deletions
diff --git a/make/scripts/runtest.sh b/make/scripts/runtest.sh index d389980..2f3b9b0 100755 --- a/make/scripts/runtest.sh +++ b/make/scripts/runtest.sh @@ -112,7 +112,7 @@ function onetest() { #onetest com.jogamp.common.util.TestValueConversion 2>&1 | tee -a $LOG #onetest com.jogamp.common.util.TestSyncRingBuffer01 $* #onetest com.jogamp.common.util.TestLFRingBuffer01 $* -onetest com.jogamp.common.util.TestBitfield00 2>&1 | tee -a $LOG +#onetest com.jogamp.common.util.TestBitfield00 2>&1 | tee -a $LOG #onetest com.jogamp.common.util.TestBitstream00 2>&1 | tee -a $LOG #onetest com.jogamp.common.util.TestBitstream01 2>&1 | tee -a $LOG #onetest com.jogamp.common.util.TestBitstream02 2>&1 | tee -a $LOG @@ -134,7 +134,7 @@ onetest com.jogamp.common.util.TestBitfield00 2>&1 | tee -a $LOG #onetest com.jogamp.common.nio.TestByteBufferInputStream 2>&1 | tee -a $LOG #onetest com.jogamp.common.nio.TestByteBufferOutputStream 2>&1 | tee -a $LOG #onetest com.jogamp.common.nio.TestByteBufferCopyStream 2>&1 | tee -a $LOG -#onetest com.jogamp.common.os.TestElfReader01 $* 2>&1 | tee -a $LOG +onetest com.jogamp.common.os.TestElfReader01 $* 2>&1 | tee -a $LOG #onetest com.jogamp.gluegen.test.junit.internals.TestType 2>&1 | tee -a $LOG #onetest com.jogamp.gluegen.test.junit.generation.PCPPTest 2>&1 | tee -a $LOG diff --git a/src/java/com/jogamp/common/os/NativeLibrary.java b/src/java/com/jogamp/common/os/NativeLibrary.java index 1570308..49e921f 100644 --- a/src/java/com/jogamp/common/os/NativeLibrary.java +++ b/src/java/com/jogamp/common/os/NativeLibrary.java @@ -144,7 +144,7 @@ public final class NativeLibrary implements DynamicLookupHelper { * @throws SecurityException if user is not granted access for the named library. */ public static final NativeLibrary open(final String libName, final ClassLoader loader) throws SecurityException { - return open(libName, libName, libName, loader, true); + return open(libName, libName, libName, true, loader, true); } /** Opens the given native library, assuming it has the same base @@ -154,7 +154,7 @@ public final class NativeLibrary implements DynamicLookupHelper { * @throws SecurityException if user is not granted access for the named library. */ public static final NativeLibrary open(final String libName, final ClassLoader loader, final boolean global) throws SecurityException { - return open(libName, libName, libName, loader, global); + return open(libName, libName, libName, true, loader, global); } /** Opens the given native library, assuming it has the given base @@ -162,6 +162,10 @@ public final class NativeLibrary implements DynamicLookupHelper { Windows, Unix and Mac OS X platforms, respectively, and in the context of the specified ClassLoader, which is used to help find the library in the case of e.g. Java Web Start. + <p> + The {@code searchSystemPathFirst} argument changes the behavior to first + search the default system path rather than searching it last. + </p> Note that we do not currently handle DSO versioning on Unix. Experience with JOAL and OpenAL has shown that it is extremely problematic to rely on a specific .so version (for one thing, @@ -174,8 +178,9 @@ public final class NativeLibrary implements DynamicLookupHelper { public static final NativeLibrary open(final String windowsLibName, final String unixLibName, final String macOSXLibName, + final boolean searchSystemPathFirst, final ClassLoader loader) throws SecurityException { - return open(windowsLibName, unixLibName, macOSXLibName, loader, true); + return open(windowsLibName, unixLibName, macOSXLibName, searchSystemPathFirst, loader, true); } /** @@ -184,10 +189,13 @@ public final class NativeLibrary implements DynamicLookupHelper { public static final NativeLibrary open(final String windowsLibName, final String unixLibName, final String macOSXLibName, - final ClassLoader loader, final boolean global) throws SecurityException { + final boolean searchSystemPathFirst, + final ClassLoader loader, + final boolean global) throws SecurityException { final List<String> possiblePaths = enumerateLibraryPaths(windowsLibName, unixLibName, macOSXLibName, + searchSystemPathFirst, loader); Platform.initSingleton(); // loads native gluegen-rt library @@ -362,11 +370,33 @@ public final class NativeLibrary implements DynamicLookupHelper { /** Given the base library names (no prefixes/suffixes) for the various platforms, enumerate the possible locations and names of - the indicated native library on the system. */ + the indicated native library on the system not using the system path. */ public static final List<String> enumerateLibraryPaths(final String windowsLibName, final String unixLibName, final String macOSXLibName, final ClassLoader loader) { + return enumerateLibraryPaths(windowsLibName, unixLibName, macOSXLibName, + false /* searchSystemPath */, false /* searchSystemPathFirst */, + loader); + } + /** Given the base library names (no prefixes/suffixes) for the + various platforms, enumerate the possible locations and names of + the indicated native library on the system using the system path. */ + public static final List<String> enumerateLibraryPaths(final String windowsLibName, + final String unixLibName, + final String macOSXLibName, + final boolean searchSystemPathFirst, + final ClassLoader loader) { + return enumerateLibraryPaths(windowsLibName, unixLibName, macOSXLibName, + true /* searchSystemPath */, searchSystemPathFirst, + loader); + } + private static final List<String> enumerateLibraryPaths(final String windowsLibName, + final String unixLibName, + final String macOSXLibName, + final boolean searchSystemPath, + final boolean searchSystemPathFirst, + final ClassLoader loader) { final List<String> paths = new ArrayList<String>(); final String libName = selectName(windowsLibName, unixLibName, macOSXLibName); if (libName == null) { @@ -382,6 +412,20 @@ public final class NativeLibrary implements DynamicLookupHelper { final String[] baseNames = buildNames(libName); + if( searchSystemPath && searchSystemPathFirst ) { + // Add just the library names to use the OS's search algorithm + for (int i = 0; i < baseNames.length; i++) { + paths.add(baseNames[i]); + } + // Add probable Mac OS X-specific paths + if ( isOSX ) { + // Add historical location + addPaths("/Library/Frameworks/" + libName + ".Framework", baseNames, paths); + // Add current location + addPaths("/System/Library/Frameworks/" + libName + ".Framework", baseNames, paths); + } + } + // The idea to ask the ClassLoader to find the library is borrowed // from the LWJGL library final String clPath = findLibrary(libName, loader); @@ -399,11 +443,26 @@ public final class NativeLibrary implements DynamicLookupHelper { if(null != usrPath) { count++; } + final String sysPath; + if( searchSystemPath ) { + sysPath = System.getProperty("sun.boot.library.path"); + if(null != sysPath) { + count++; + } + } else { + sysPath = null; + } final String[] res = new String[count]; int i=0; + if( null != sysPath && searchSystemPathFirst ) { + res[i++] = sysPath; + } if(null != usrPath) { res[i++] = usrPath; } + if( null != sysPath && !searchSystemPathFirst ) { + res[i++] = sysPath; + } return res; } }); @@ -430,6 +489,20 @@ public final class NativeLibrary implements DynamicLookupHelper { // to handle Bug 1145 cc1 using an unpacked fat-jar addPaths(userDir+File.separator+"natives"+File.separator+PlatformPropsImpl.os_and_arch+File.separator, baseNames, paths); + if( searchSystemPath && !searchSystemPathFirst ) { + // Add just the library names to use the OS's search algorithm + for (int i = 0; i < baseNames.length; i++) { + paths.add(baseNames[i]); + } + // Add probable Mac OS X-specific paths + if ( isOSX ) { + // Add historical location + addPaths("/Library/Frameworks/" + libName + ".Framework", baseNames, paths); + // Add current location + addPaths("/System/Library/Frameworks/" + libName + ".Framework", baseNames, paths); + } + } + return paths; } diff --git a/src/java/jogamp/common/os/PlatformPropsImpl.java b/src/java/jogamp/common/os/PlatformPropsImpl.java index 608d754..097a013 100644 --- a/src/java/jogamp/common/os/PlatformPropsImpl.java +++ b/src/java/jogamp/common/os/PlatformPropsImpl.java @@ -446,7 +446,7 @@ public abstract class PlatformPropsImpl { } private static File findSysLib(final String libName) { final ClassLoader cl = PlatformPropsImpl.class.getClassLoader(); - final List<String> possibleLibPaths = NativeLibrary.enumerateLibraryPaths(libName, libName, libName, cl); + final List<String> possibleLibPaths = NativeLibrary.enumerateLibraryPaths(libName, libName, libName, true, cl); for(int i=0; i<possibleLibPaths.size(); i++) { final String libPath = possibleLibPaths.get(i); final File lib = new File(libPath); diff --git a/src/junit/com/jogamp/common/os/TestElfReader01.java b/src/junit/com/jogamp/common/os/TestElfReader01.java index fe03728..980a17a 100644 --- a/src/junit/com/jogamp/common/os/TestElfReader01.java +++ b/src/junit/com/jogamp/common/os/TestElfReader01.java @@ -38,7 +38,7 @@ public class TestElfReader01 extends SingletonJunitCase { } static File findJVMLib(final String libName) { final ClassLoader cl = TestElfReader01.class.getClassLoader(); - final List<String> possibleLibPaths = NativeLibrary.enumerateLibraryPaths(libName, libName, libName, cl); + final List<String> possibleLibPaths = NativeLibrary.enumerateLibraryPaths(libName, libName, libName, true, cl); for(int i=0; i<possibleLibPaths.size(); i++) { final String libPath = possibleLibPaths.get(i); final File lib = new File(libPath); |