10

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

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

    public static native void print();
}

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

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

4

2 回答 2

21

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

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

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

于 2012-05-21T22:24:28.273 回答
0

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

于 2012-05-21T20:01:39.183 回答