加载本机库

在 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.UnsatisfiedLinkErrors。

目标文件查找

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");
    }

    ...