是否存在与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库名。
答案 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
。这可能看起来不方便,但它比依赖图书馆搜索路径变幻莫测的要强大得多。