儘管沒有很好的文檔記錄,但就System.loadLibrary()
方法而言,java.library.path
系統屬性是「只讀」屬性。這是一個reported bug,但它被Sun關閉,而不是被修復。問題在於JVM的ClassLoader在啓動時讀取一次該屬性,然後將其緩存起來,不允許我們在之後以編程方式更改它。除System.getProperty()
方法調用外,行System.setProperty("java.library.path", anyVal);
將不起作用。
幸運的是,有人posted a workaround on the Sun forums。不幸的是,該鏈接不再有效,但我確實發現了the code on another source。這裏是你可以用它來解決不能夠設置java.library.path
系統屬性的代碼:這可能不是在所有的平臺和/或JVM中工作:
public static void addDir(String s) throws IOException {
try {
// This enables the java.library.path to be modified at runtime
// From a Sun engineer at http://forums.sun.com/thread.jspa?threadID=707176
//
Field field = ClassLoader.class.getDeclaredField("usr_paths");
field.setAccessible(true);
String[] paths = (String[])field.get(null);
for (int i = 0; i < paths.length; i++) {
if (s.equals(paths[i])) {
return;
}
}
String[] tmp = new String[paths.length+1];
System.arraycopy(paths,0,tmp,0,paths.length);
tmp[paths.length] = s;
field.set(null,tmp);
System.setProperty("java.library.path", System.getProperty("java.library.path") + File.pathSeparator + s);
} catch (IllegalAccessException e) {
throw new IOException("Failed to get permissions to set library path");
} catch (NoSuchFieldException e) {
throw new IOException("Failed to get field handle to set library path");
}
}
警告。
'java.library.path'指*目錄*不是*文件* – jacktrades 2015-04-02 18:15:46