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).