使用相对路径名从不同目录加载JNI库的可移植语句?

时间:2012-05-21 19:55:14

标签: java java-native-interface loadlibrary

是否存在与Java源代码所在的不同目录中加载本机库的独立于平台的Java语句?我想用这样的东西:

public class HelloWorld {
    static {
        System.loadLibrary("../some_project/HelloWorld");
    }

    public static native void print();
}

问题是System.loadLibrary()不支持pathname参数中的目录分隔符。另外,不幸的是,System.load()需要一个绝对路径名,这不仅意味着我不能像上面那样指定一个相对目录(我想做),但它还要求参数包括,例如,前面的Linux系统上JNI库名称的“lib”和“.so”扩展名。

有没有一种标准的处理方法?如果可能的话,我想避免编写一堆依赖于平台的Java代码来构造正确的JNI库名。

2 个答案:

答案 0 :(得分:19)

我相信您正在寻找System.mapLibraryName,这是ClassLoader.findLibrary实施通常使用的方法。例如:

File lib = new File("../some_project/" + System.mapLibraryName("HelloWorld"));
System.load(lib.getAbsolutePath());

这将在Linux上使用libHelloWorld.so,在Windows上使用HelloWorld.dll。请注意,某些操作系统支持多个扩展,而mapLibraryName只能通过设计支持一个。我所知道的是MacOS(主要是.dylib和传统的.jnilib)和AIX(.a.so)。

答案 1 :(得分:0)

嗯,正如您已经清楚解释过的那样,您无法使用loadLibrary。离开load。但这需要一条绝对的道路。因此,使用首选文件路径实用程序函数将相对路径扩展为绝对路径,并将其传递给load。这可能看起来不方便,但它比依赖图书馆搜索路径变幻莫测的要强大得多。