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

jvm*_*ate 9 java java-native-interface loadlibrary

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

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

    public static native void print();
}
Run Code Online (Sandbox Code Playgroud)

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

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

Bre*_*ail 19

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

File lib = new File("../some_project/" + System.mapLibraryName("HelloWorld"));
System.load(lib.getAbsolutePath());
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢!这就是我想要的.我只是尝试过,效果很好.仅供任何读取此内容的人参考,System.load()需要绝对路径名,因此必须使目录成为绝对目录并添加尾部斜杠,例如,使用以下代码:new java.io.File(". ./some_project /").getCanonicalPath()+"/" (2认同)