diff --git a/src/java/org/lwjgl/LWJGLUtil.java b/src/java/org/lwjgl/LWJGLUtil.java new file mode 100644 index 00000000..f4f927a6 --- /dev/null +++ b/src/java/org/lwjgl/LWJGLUtil.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2002-2005 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl; + +import org.lwjgl.LWJGLException; +import org.lwjgl.Sys; + +import java.io.File; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; + +/** + * $Id$ + *

+ * Internal library methods + *

+ * + * @author Brian Matzon + * @version $Revision$ + */ +public class LWJGLUtil { + + /** + * Locates the paths required by a library. + * + * @param libNames List of library names to look for, in the form of Local Library name, Platform library name. + * At least 6 names must be passed. 2 for each supported platform in the following order: Windows, Linux, MacOSX. + * @param classloader The classloader to ask for librariy paths + * @return Paths to located libraries, if any + */ + public static String[] getLibraryPaths(String[] libNames, ClassLoader classloader) throws LWJGLException { + // need to pass path of possible locations of IL to native side + List possible_paths = new ArrayList(); + + String osName = System.getProperty("os.name"); + + String libname; + String platform_lib_name; + if (osName.startsWith("Win")) { + libname = libNames[0]; + platform_lib_name = libNames[1]; + } else if (osName.startsWith("Lin")) { + libname = libNames[2]; + platform_lib_name = libNames[3]; + } else if (osName.startsWith("Mac")) { + libname = libNames[4]; + platform_lib_name = libNames[5]; + } else { + throw new LWJGLException("Unknown platform: " + osName); + } + + // Add all possible paths from java.library.path + StringTokenizer st = new StringTokenizer(System.getProperty("java.library.path"), File.pathSeparator); + while (st.hasMoreTokens()) { + String path = st.nextToken(); + possible_paths.add(path + File.separator + platform_lib_name); + } + + String classloader_path = LWJGLUtil.getPathFromClassLoader(libname, classloader); + if (classloader_path != null) { + Sys.log("getPathFromClassLoader: Path found: " + classloader_path); + possible_paths.add(classloader_path); + } + + String lwjgl_classloader_path = LWJGLUtil.getPathFromClassLoader("lwjgl", classloader); + if (lwjgl_classloader_path != null) { + Sys.log("getPathFromClassLoader: Path found: " + lwjgl_classloader_path); + possible_paths.add(lwjgl_classloader_path.substring(0, lwjgl_classloader_path.lastIndexOf(File.separator)) + + File.separator + platform_lib_name); + } + + //add cwd path + possible_paths.add(platform_lib_name); + + //create needed string array + String[] paths = new String[possible_paths.size()]; + possible_paths.toArray(paths); + + return paths; + } + + /** + * Tries to locate named library from the current ClassLoader + * This method exists because native libraries are loaded from native code, and as such + * is exempt from ClassLoader library loading rutines. It therefore always fails. + * We therefore invoke the protected method of the ClassLoader to see if it can + * locate it. + * + * @param libname Name of library to search for + * @param classloader Classloader to use + * @return Absolute path to library if found, otherwise null + */ + public static String getPathFromClassLoader(String libname, ClassLoader classloader) { + try { + Sys.log("getPathFromClassLoader: searching for: " + libname); + Object o = classloader; + Class c = o.getClass(); + while (c != null) { + try { + Method findLibrary = c.getDeclaredMethod("findLibrary", new Class[] { String.class}); + findLibrary.setAccessible(true); + Object[] arguments = new Object[] {libname}; + return (String) findLibrary.invoke(o, arguments); + } catch (NoSuchMethodException e) { + c = c.getSuperclass(); + } + } + } catch (Exception e) { + Sys.log("Failure locating " + e + " using classloader:" + e); + } + return null; + } +} diff --git a/src/java/org/lwjgl/devil/IL.java b/src/java/org/lwjgl/devil/IL.java index ce488907..b375699c 100644 --- a/src/java/org/lwjgl/devil/IL.java +++ b/src/java/org/lwjgl/devil/IL.java @@ -47,6 +47,7 @@ import java.util.StringTokenizer; import org.lwjgl.BufferChecks; import org.lwjgl.LWJGLException; import org.lwjgl.Sys; +import org.lwjgl.LWJGLUtil; /** * $Id$ @@ -585,7 +586,10 @@ public class IL { return; } - String[] illPaths = getILPaths(); + String[] illPaths = LWJGLUtil.getLibraryPaths(new String[]{ + "DevIL", "DevIL.dll", + "IL", "libIL.so", + "IL", "IL"}, IL.class.getClassLoader()); nCreate(illPaths); created = true; @@ -621,85 +625,4 @@ public class IL { * Native method the destroy the IL */ protected static native void nDestroy(); - - private static String[] getILPaths() throws LWJGLException { - // need to pass path of possible locations of IL to native side - List possible_paths = new ArrayList(); - - String osName = System.getProperty("os.name"); - - String libname; - String platform_lib_name; - if (osName.startsWith("Win")) { - libname = "DevIL"; - platform_lib_name = "DevIL.dll"; - } else if (osName.startsWith("Lin")) { - libname = "DevIL"; - platform_lib_name = "libIL.so"; - } else if (osName.startsWith("Mac")) { - libname = "DevIL"; - platform_lib_name = "libIL.dylib"; - } else { - throw new LWJGLException("Unknown platform: " + osName); - } - - // Add all possible paths from java.library.path - StringTokenizer st = new StringTokenizer(System.getProperty("java.library.path"), File.pathSeparator); - while (st.hasMoreTokens()) { - String path = st.nextToken(); - possible_paths.add(path + File.separator + platform_lib_name); - } - - String classloader_path = getPathFromClassLoader(libname); - if (classloader_path != null) { - Sys.log("getPathFromClassLoader: Path found: " + classloader_path); - possible_paths.add(classloader_path); - } - String lwjgl_classloader_path = getPathFromClassLoader("lwjgl"); - if (lwjgl_classloader_path != null) { - Sys.log("getPathFromClassLoader: Path found: " + lwjgl_classloader_path); - possible_paths.add(lwjgl_classloader_path.substring(0, lwjgl_classloader_path.lastIndexOf(File.separator)) - + File.separator + platform_lib_name); - } - - //add cwd path - possible_paths.add(platform_lib_name); - - //create needed string array - String[] ilPaths = new String[possible_paths.size()]; - possible_paths.toArray(ilPaths); - - return ilPaths; - } - - /** - * Tries to locate Devil from the current ClassLoader - * This method exists because Devil is loaded from native code, and as such - * is exempt from ClassLoader library loading rutines. Devil therefore always fails. - * We therefore invoke the protected method of the ClassLoader to see if it can - * locate it. - * - * @param libname Name of library to search for - * @return Absolute path to library if found, otherwise null - */ - private static String getPathFromClassLoader(String libname) { - try { - Sys.log("getPathFromClassLoader: searching for: " + libname); - Object o = IL.class.getClassLoader(); - Class c = o.getClass(); - while (c != null) { - try { - Method findLibrary = c.getDeclaredMethod("findLibrary", new Class[] { String.class}); - findLibrary.setAccessible(true); - Object[] arguments = new Object[] { libname}; - return (String) findLibrary.invoke(o, arguments); - } catch (NoSuchMethodException e) { - c = c.getSuperclass(); - } - } - } catch (Exception e) { - Sys.log("Failure locating DevIL using classloader:" + e); - } - return null; - } } diff --git a/src/java/org/lwjgl/devil/ILU.java b/src/java/org/lwjgl/devil/ILU.java index 5bb3c5e6..9727ff00 100644 --- a/src/java/org/lwjgl/devil/ILU.java +++ b/src/java/org/lwjgl/devil/ILU.java @@ -41,6 +41,8 @@ import java.util.StringTokenizer; import org.lwjgl.BufferChecks; import org.lwjgl.LWJGLException; import org.lwjgl.Sys; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.LWJGLUtil; /** * $Id$ @@ -168,7 +170,10 @@ public class ILU { throw new LWJGLException("Cannot create ILU without having created IL instance"); } - String[] iluPaths = getILUPaths(); + String[] iluPaths = LWJGLUtil.getLibraryPaths(new String[]{ + "ILU", "ILU.dll", + "ILU", "libILU.so", + "ILU", "ILU"}, ILU.class.getClassLoader()); nCreate(iluPaths); created = true; @@ -208,85 +213,4 @@ public class ILU { * Native method the destroy the ILU */ protected static native void nDestroy(); - - private static String[] getILUPaths() throws LWJGLException { - // need to pass path of possible locations of ILU to native side - List possible_paths = new ArrayList(); - - String osName = System.getProperty("os.name"); - - String libname; - String platform_lib_name; - if (osName.startsWith("Win")) { - libname = "ILU"; - platform_lib_name = "ILU.dll"; - } else if (osName.startsWith("Lin")) { - libname = "ILU"; - platform_lib_name = "libILU.so"; - } else if (osName.startsWith("Mac")) { - libname = "ILU"; - platform_lib_name = "libILU.dylib"; - } else { - throw new LWJGLException("Unknown platform: " + osName); - } - - // Add all possible paths from java.library.path - StringTokenizer st = new StringTokenizer(System.getProperty("java.library.path"), File.pathSeparator); - while (st.hasMoreTokens()) { - String path = st.nextToken(); - possible_paths.add(path + File.separator + platform_lib_name); - } - - String classloader_path = getPathFromClassLoader(libname); - if (classloader_path != null) { - Sys.log("getPathFromClassLoader: Path found: " + classloader_path); - possible_paths.add(classloader_path); - } - String lwjgl_classloader_path = getPathFromClassLoader("lwjgl"); - if (lwjgl_classloader_path != null) { - Sys.log("getPathFromClassLoader: Path found: " + lwjgl_classloader_path); - possible_paths.add(lwjgl_classloader_path.substring(0, lwjgl_classloader_path.lastIndexOf(File.separator)) - + File.separator + platform_lib_name); - } - - //add cwd path - possible_paths.add(platform_lib_name); - - //create needed string array - String[] iluPaths = new String[possible_paths.size()]; - possible_paths.toArray(iluPaths); - - return iluPaths; - } - - /** - * Tries to locate ILU from the current ClassLoader - * This method exists because ILU is loaded from native code, and as such - * is exempt from ClassLoader library loading rutines. ILU therefore always fails. - * We therefore invoke the protected method of the ClassLoader to see if it can - * locate it. - * - * @param libname Name of library to search for - * @return Absolute path to library if found, otherwise null - */ - private static String getPathFromClassLoader(String libname) { - try { - Sys.log("getPathFromClassLoader: searching for: " + libname); - Object o = ILU.class.getClassLoader(); - Class c = o.getClass(); - while (c != null) { - try { - Method findLibrary = c.getDeclaredMethod("findLibrary", new Class[] { String.class}); - findLibrary.setAccessible(true); - Object[] arguments = new Object[] { libname}; - return (String) findLibrary.invoke(o, arguments); - } catch (NoSuchMethodException e) { - c = c.getSuperclass(); - } - } - } catch (Exception e) { - Sys.log("Failure locating ILU using classloader:" + e); - } - return null; - } } diff --git a/src/java/org/lwjgl/devil/ILUT.java b/src/java/org/lwjgl/devil/ILUT.java index 1fdfab79..38e4afe9 100644 --- a/src/java/org/lwjgl/devil/ILUT.java +++ b/src/java/org/lwjgl/devil/ILUT.java @@ -41,6 +41,7 @@ import java.util.StringTokenizer; import org.lwjgl.LWJGLException; import org.lwjgl.Sys; +import org.lwjgl.LWJGLUtil; /** * $Id$ @@ -133,7 +134,10 @@ public class ILUT { throw new LWJGLException("Cannot create ILUT without having created IL instance"); } - String[] ilutPaths = getILUTPaths(); + String[] ilutPaths = LWJGLUtil.getLibraryPaths(new String[]{ + "ILUT", "ILUT.dll", + "ILUT", "libILUT.so", + "ILUT", "IL"}, ILU.class.getClassLoader()); nCreate(ilutPaths); created = true; @@ -173,85 +177,4 @@ public class ILUT { * Native method the destroy the ILUT */ protected static native void nDestroy(); - - private static String[] getILUTPaths() throws LWJGLException { - // need to pass path of possible locations of IL to native side - List possible_paths = new ArrayList(); - - String osName = System.getProperty("os.name"); - - String libname; - String platform_lib_name; - if (osName.startsWith("Win")) { - libname = "ILUT"; - platform_lib_name = "ILUT.dll"; - } else if (osName.startsWith("Lin")) { - libname = "ILUT"; - platform_lib_name = "libILUT.so"; - } else if (osName.startsWith("Mac")) { - libname = "ILUT"; - platform_lib_name = "libILUT.dylib"; - } else { - throw new LWJGLException("Unknown platform: " + osName); - } - - // Add all possible paths from java.library.path - StringTokenizer st = new StringTokenizer(System.getProperty("java.library.path"), File.pathSeparator); - while (st.hasMoreTokens()) { - String path = st.nextToken(); - possible_paths.add(path + File.separator + platform_lib_name); - } - - String classloader_path = getPathFromClassLoader(libname); - if (classloader_path != null) { - Sys.log("getPathFromClassLoader: Path found: " + classloader_path); - possible_paths.add(classloader_path); - } - String lwjgl_classloader_path = getPathFromClassLoader("lwjgl"); - if (lwjgl_classloader_path != null) { - Sys.log("getPathFromClassLoader: Path found: " + lwjgl_classloader_path); - possible_paths.add(lwjgl_classloader_path.substring(0, lwjgl_classloader_path.lastIndexOf(File.separator)) - + File.separator + platform_lib_name); - } - - //add cwd path - possible_paths.add(platform_lib_name); - - //create needed string array - String[] ilutPaths = new String[possible_paths.size()]; - possible_paths.toArray(ilutPaths); - - return ilutPaths; - } - - /** - * Tries to locate ILUT from the current ClassLoader - * This method exists because ILUT is loaded from native code, and as such - * is exempt from ClassLoader library loading rutines. ILUT therefore always fails. - * We therefore invoke the protected method of the ClassLoader to see if it can - * locate it. - * - * @param libname Name of library to search for - * @return Absolute path to library if found, otherwise null - */ - private static String getPathFromClassLoader(String libname) { - try { - Sys.log("getPathFromClassLoader: searching for: " + libname); - Object o = ILUT.class.getClassLoader(); - Class c = o.getClass(); - while (c != null) { - try { - Method findLibrary = c.getDeclaredMethod("findLibrary", new Class[] { String.class}); - findLibrary.setAccessible(true); - Object[] arguments = new Object[] { libname}; - return (String) findLibrary.invoke(o, arguments); - } catch (NoSuchMethodException e) { - c = c.getSuperclass(); - } - } - } catch (Exception e) { - Sys.log("Failure locating ILUT using classloader:" + e); - } - return null; - } } diff --git a/src/java/org/lwjgl/openal/AL.java b/src/java/org/lwjgl/openal/AL.java index 6408aff8..12b16935 100644 --- a/src/java/org/lwjgl/openal/AL.java +++ b/src/java/org/lwjgl/openal/AL.java @@ -40,6 +40,9 @@ import java.util.ArrayList; import org.lwjgl.LWJGLException; import org.lwjgl.Sys; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.devil.ILU; +import org.lwjgl.LWJGLUtil; /** * $Id$ @@ -131,56 +134,6 @@ public final class AL { create(); } - private static String[] getOALPaths() throws LWJGLException { - // need to pass path of possible locations of OAL to native side - List possible_paths = new ArrayList(); - - String osName = System.getProperty("os.name"); - - String libname; - String platform_lib_name; - if (osName.startsWith("Win")) { - libname = "lwjglaudio"; - platform_lib_name = "lwjglaudio.dll"; - } else if (osName.startsWith("Lin")) { - libname = "openal"; - platform_lib_name = "libopenal.so"; - } else if (osName.startsWith("Mac")) { - libname = "openal"; - platform_lib_name = "openal.dylib"; - } else { - throw new LWJGLException("Unknown platform: "+osName); - } - - // Add all possible paths from java.library.path - String java_library_path = System.getProperty("java.library.path"); - StringTokenizer st = new StringTokenizer(System.getProperty("java.library.path"), File.pathSeparator); - while (st.hasMoreTokens()) { - String path = st.nextToken(); - possible_paths.add(path + File.separator + platform_lib_name); - } - - String classloader_path = getPathFromClassLoader(libname); - if (classloader_path != null) { - Sys.log("getPathFromClassLoader: Path found: " + classloader_path); - possible_paths.add(classloader_path); - } - String lwjgl_classloader_path = getPathFromClassLoader("lwjgl"); - if (lwjgl_classloader_path != null) { - Sys.log("getPathFromClassLoader: Path found: " + lwjgl_classloader_path); - possible_paths.add(lwjgl_classloader_path.substring(0, lwjgl_classloader_path.lastIndexOf(File.separator)) - + File.separator + platform_lib_name); - } - - //add cwd path - possible_paths.add(platform_lib_name); - //create needed string array - String[] oalPaths = new String[possible_paths.size()]; - possible_paths.toArray(oalPaths); - - return oalPaths; - } - /** * Creates an OpenAL instance. The empty create will cause OpenAL to * open the default device, and create a context using default values. @@ -189,7 +142,10 @@ public final class AL { if (created) { return; } - String[] oalPaths = getOALPaths(); + String[] oalPaths = LWJGLUtil.getLibraryPaths(new String[]{ + "lwjglaudio", "lwjglaudio.dll", + "openal", "openal.so", + "openal", "openal.dylib"}, AL.class.getClassLoader()); nCreate(oalPaths); created = true; @@ -240,37 +196,6 @@ public final class AL { nDestroy(); created = false; } - - /** - * Tries to locate OpenAL from the current ClassLoader - * This method exists because OpenAL is loaded from native code, and as such - * is exempt from ClassLoader library loading rutines. OpenAL therefore always fails. - * We therefore invoke the protected method of the ClassLoader to see if it can - * locate it. - * - * @param libname Name of library to search for - * @return Absolute path to library if found, otherwise null - */ - private static String getPathFromClassLoader(String libname) { - try { - Sys.log("getPathFromClassLoader: searching for: " + libname); - Object o = AL.class.getClassLoader(); - Class c = o.getClass(); - while (c != null) { - try { - Method findLibrary = c.getDeclaredMethod("findLibrary", new Class[] { String.class }); - findLibrary.setAccessible(true); - Object[] arguments = new Object[] { libname }; - return (String)findLibrary.invoke(o, arguments); - } catch (NoSuchMethodException e) { - c = c.getSuperclass(); - } - } - } catch (Exception e) { - Sys.log("Failure locating OpenAL using classloader:" + e); - } - return null; - } private static native void resetNativeStubs(Class clazz);