載入本機庫

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

    ...