diff options
Diffstat (limited to 'src/java/com')
-rw-r--r-- | src/java/com/jogamp/common/os/NativeLibrary.java | 83 |
1 files changed, 78 insertions, 5 deletions
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; } |