Class Library


  • public class Library
    extends java.lang.Object
    Used to find and load a JNI library, eventually after having extracted it. It will search for the library in order at the following locations:
    1. in the custom library path: If the "library.${name}.path" System property is set to a directory, subdirectories are searched:
      1. "${platform}/${arch}"
      2. "${platform}"
      3. "${os}"
      4. ""
      for 2 namings of the library:
      1. as "${name}-${version}" library name if the version can be determined.
      2. as "${name}" library name
    2. system library path: This is where the JVM looks for JNI libraries by default.
      1. as "${name}${bit-model}-${version}" library name if the version can be determined.
      2. as "${name}-${version}" library name if the version can be determined.
      3. as "${name}" library name
    3. classpath path: If the JNI library can be found on the classpath, it will get extracted and then loaded. This way you can embed your JNI libraries into your packaged JAR files. They are looked up as resources in this order:
      1. "META-INF/native/${platform}/${arch}/${library[-version]}": Store your library here if you want to embed more than one platform JNI library on different processor archs in the jar.
      2. "META-INF/native/${platform}/${library[-version]}": Store your library here if you want to embed more than one platform JNI library in the jar.
      3. "META-INF/native/${os}/${library[-version]}": Store your library here if you want to embed more than one platform JNI library in the jar but don't want to take bit model into account.
      4. "META-INF/native/${library[-version]}": Store your library here if your JAR is only going to embedding one platform library.
      The file extraction is attempted until it succeeds in the following directories.
      1. The directory pointed to by the "library.${name}.path" System property (if set)
      2. a temporary directory (uses the "java.io.tmpdir" System property)
    where:
    • "${name}" is the name of library
    • "${version}" is the value of "library.${name}.version" System property if set. Otherwise it is set to the ImplementationVersion property of the JAR's Manifest
    • "${os}" is your operating system, for example "osx", "linux", or "windows"
    • "${bit-model}" is "64" if the JVM process is a 64 bit process, otherwise it's "32" if the JVM is a 32 bit process
    • "${arch}" is the architecture for the processor, for example "amd64" or "sparcv9"
    • "${platform}" is "${os}${bit-model}", for example "linux32" or "osx64"
    • "${library[-version]}": is the normal jni library name for the platform (eventually with -${version}) suffix. For example "${name}.dll" on windows, "lib${name}.jnilib" on OS X, and "lib${name}.so" on linux
    See Also:
    System.mapLibraryName(String)
    • Field Detail

      • STRATEGY_PROPERTY

        public static final java.lang.String STRATEGY_PROPERTY
        See Also:
        Constant Field Values
      • SLASH

        static final java.lang.String SLASH
      • STRATEGY

        static final java.lang.String STRATEGY
      • name

        private final java.lang.String name
      • version

        private final java.lang.String version
      • classLoader

        private final java.lang.ClassLoader classLoader
      • loaded

        private boolean loaded
      • nativeLibraryPath

        private java.lang.String nativeLibraryPath
      • nativeLibrarySourceUrl

        private java.net.URL nativeLibrarySourceUrl
    • Constructor Detail

      • Library

        public Library​(java.lang.String name)
      • Library

        public Library​(java.lang.String name,
                       java.lang.Class<?> clazz)
      • Library

        public Library​(java.lang.String name,
                       java.lang.String version)
      • Library

        public Library​(java.lang.String name,
                       java.lang.String version,
                       java.lang.ClassLoader classLoader)
    • Method Detail

      • version

        private static java.lang.String version​(java.lang.Class<?> clazz)
      • getNativeLibraryPath

        public java.lang.String getNativeLibraryPath()
        Get the path to the native library loaded.
        Returns:
        the path (should not be null once the library is loaded)
        Since:
        1.16
      • getNativeLibrarySourceUrl

        public java.net.URL getNativeLibrarySourceUrl()
        Get the URL to the native library source that has been extracted (if it was extracted).
        Returns:
        the url to the source (in classpath)
        Since:
        1.16
      • getOperatingSystem

        public static java.lang.String getOperatingSystem()
      • getPlatform

        public static java.lang.String getPlatform()
      • getBitModel

        public static int getBitModel()
      • load

        public void load()
        Load the native library.
      • doLoad

        private void doLoad()
      • getArchSpecifcResourcePath

        @Deprecated
        public final java.lang.String getArchSpecifcResourcePath()
        Deprecated.
      • getArchSpecificResourcePath

        public final java.lang.String getArchSpecificResourcePath()
      • getOperatingSystemSpecifcResourcePath

        @Deprecated
        public final java.lang.String getOperatingSystemSpecifcResourcePath()
        Deprecated.
      • getOperatingSystemSpecificResourcePath

        public final java.lang.String getOperatingSystemSpecificResourcePath()
      • getPlatformSpecifcResourcePath

        @Deprecated
        public final java.lang.String getPlatformSpecifcResourcePath()
        Deprecated.
      • getPlatformSpecificResourcePath

        public final java.lang.String getPlatformSpecificResourcePath()
      • getPlatformSpecifcResourcePath

        @Deprecated
        public final java.lang.String getPlatformSpecifcResourcePath​(java.lang.String platform)
        Deprecated.
      • getPlatformSpecificResourcePath

        public final java.lang.String getPlatformSpecificResourcePath​(java.lang.String platform)
      • getResorucePath

        @Deprecated
        public final java.lang.String getResorucePath()
        Deprecated.
      • getResourcePath

        public final java.lang.String getResourcePath()
      • getLibraryFileName

        public final java.lang.String getLibraryFileName()
      • getSpecificSearchDirs

        public final java.lang.String[] getSpecificSearchDirs()
        Search directories for library:
        • ${platform}/${arch} to enable platform JNI library for different processor archs
        • ${platform} to enable platform JNI library
        • ${os} to enable OS JNI library
        • no directory
        Returns:
        the list
        Since:
        1.15
      • extractAndLoad

        private boolean extractAndLoad​(java.util.ArrayList<java.lang.Throwable> errors,
                                       java.lang.String customPath,
                                       java.lang.String dir,
                                       java.lang.String libName,
                                       java.lang.String targetLibName)
      • file

        private java.io.File file​(java.lang.String... paths)
      • map

        private java.lang.String map​(java.lang.String libName)
      • extractSha1

        private java.io.File extractSha1​(java.util.ArrayList<java.lang.Throwable> errors,
                                         java.net.URL source,
                                         java.lang.String prefix,
                                         java.lang.String suffix,
                                         java.io.File directory)
      • computeSha1

        private java.lang.String computeSha1​(java.io.InputStream is)
                                      throws java.security.NoSuchAlgorithmException,
                                             java.io.IOException
        Throws:
        java.security.NoSuchAlgorithmException
        java.io.IOException
      • extractTemp

        private java.io.File extractTemp​(java.util.ArrayList<java.lang.Throwable> errors,
                                         java.net.URL source,
                                         java.lang.String prefix,
                                         java.lang.String suffix,
                                         java.io.File directory)
      • close

        private static void close​(java.io.Closeable file)
      • chmod755

        private void chmod755​(java.io.File file)
      • load

        private boolean load​(java.util.ArrayList<java.lang.Throwable> errors,
                             java.io.File lib)
      • loadLibrary

        private boolean loadLibrary​(java.util.ArrayList<java.lang.Throwable> errors,
                                    java.lang.String lib)