收录日期:2021/01/23 06:45:09 时间:2010-03-31 12:02:56 标签:java,osx,jni,jogl

Background

So I am attempting to load a jnilib (specifically JOGL) into Java on Mac OS X at runtime. I have been following along the relevant Stack Overflow questions:

The end goal for me is to package platform specific JOGL files into a JAR and unzip them into a temp directory and load them at start-up. I worked my problem back to simply attempting to load JOGL using hard-coded paths:

    File f = new File("/var/folders/+n/+nfb8NHsHiSpEh6AHMCyvE+++TI/-Tmp-/libjogl.jnilib");
    System.load(f.toString());
    f = new File ("/var/folders/+n/+nfb8NHsHiSpEh6AHMCyvE+++TI/-Tmp-/libjogl_awt.jnilib");
    System.load(f.toString());

I get the following exception when attempting to use the JOGL API:

    Exception in thread "main" java.lang.UnsatisfiedLinkError: no jogl in java.library.path

But when I specify java.library.path by adding the following JVM option:

    -Djava.library.path="/var/folders/+n/+nfb8NHsHiSpEh6AHMCyvE+++TI/-Tmp-/" 

Everything works fine.


Question

Is it possible use System.load (or some other variant) on Mac OS X as a replacement for -Djava.library.path that is invoked at runtime?

Jogl always tries to auto-load all dependent libraries. To avoid this, there should be a NativeLibLoader class where you can call disableLoading() before you load the libraries yourself via the System.load()

You don't have to provide the java.library.path at startup. You can programmatically set it with

System.setProperty("java.library.path", "/var/folder/bla/foo/bar/");

I don't know if System.load() will work somehow without this library path.

System.load(...) takes libraryName as argument. It doesn't take path to library as argument. JVM searches for a library with specified name in the list of paths specified in -Djava.library.path;

Here there is nothing specific to Mac OS X. It searches for libraries in the same way on all operating systems.