載入本機庫
在 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");
}
...