加载本机库
在 Java 中加载共享库文件的常用习惯如下:
public class ClassWithNativeMethods {
static {
System.loadLibrary("Example");
}
public native void someNativeMethod(String arg);
...
对 System.loadLibrary
的调用几乎总是静态的,以便在类加载期间发生,确保在加载共享库之前不能执行本机方法。但是以下是可能的:
public class ClassWithNativeMethods {
// Call this before using any native method
public static void prepareNativeMethods() {
System.loadLibrary("Example");
}
...
这允许在必要时推迟共享库加载,但需要额外注意以避免 java.lang.UnsatisfiedLinkError
s。
目标文件查找
在 java.library.path
系统属性定义的路径中搜索共享库文件,可以在运行时使用 -Djava.library.path=
JVM 参数覆盖:
java -Djava.library.path=path/to/lib/:path/to/other/lib MainClassWithNativeMethods
注意系统路径分隔符:例如,Windows 使用 ;
而不是:
。
请注意,System.loadLibrary
以依赖于平台的方式解析库文件名:上面的代码片段需要 Linux 上的文件 libExample.so
和 Windows 上的 Example.dll
。
System.loadLibrary
的替代方法是 System.load(String)
,它获取共享库文件的完整路径,绕过 java.library.path
查找:
public class ClassWithNativeMethods {
static {
System.load("/path/to/lib/libExample.so");
}
...