[fedora-java] /usr/lib/jni support in Fedora

David M. Lloyd david.lloyd at redhat.com
Tue Jul 29 14:11:29 UTC 2014


On 07/29/2014 06:05 AM, Florian Weimer wrote:
> As far as I can tell, currently, System.loadLibrary() is mostly unusable
> for Java libraries because they cannot influence the library search
> path.  If you want to transparently load a DSO, you need to use
> System.load() and hard-code the path.

Here's a bit more information on native library loading which might be 
useful.

When loading a native library, the first thing that happens is that the 
system will identify the class loader of the class with the method that 
actually calls loadLibrary().  Then it will ask this class loader to map 
the name passed into loadLibrary (e.g. "tcnative") to a properly named 
absolute path on the filesystem (e.g. "/usr/local/lib/libtcnative.so"). 
  The proper naming is usually done by a class loader by calling 
System.mapLibraryName() which translates e.g. "tcnative" to 
"libtcnative.so" (on Linux, and different mappings in different OSes).

So if you're dealing with an environment where the class loader is 
controlled, for example an application server, mostly the "right path" 
will be chosen - WildFly for example will look for native libraries 
along side the modules which load them.

However if this is a run-of-the-mill Java JAR trying to load some native 
stuff, the class loader will typically return "null" indicating that it 
has no mapping for the native library.  In this case, the 
java.library.path system property is consulted and the paths contained 
therein are searched, one by one, using the standard name mapping scheme 
described above.

Only if no matches are found using this mechanism will it default to the 
compiled-in paths AFAIK.

Once the library is found, the normal ld.so linkage rules apply since 
AFAIK it's a plain dlopen().

> The upstream default search path starts with
> "/usr/java/packages/lib/amd64" (and variants for other architectures),
> but this isn't mentioned in the Fedora guidelines.  I'm also not sure if
> we want to use this file system location because it doesn't look
> particularly FHS-compliant.  But the proprietary JDKs could install a
> symlink there so that /usr/lib{,64}/jni is searched as well.

Changing this default path seems like a sensible approach to me, FWIW.

-- 
- DML


More information about the java-devel mailing list