È possibile aggiungere un nuovo percorso per le librerie native in fase di runtime ?. (Invece di avviare Java con la proprietà java.library.path), quindi una chiamata a System.loadLibrary(nativeLibraryName)
includerà quel percorso quando si cerca di trovare nativeLibraryName
. È possibile o questi percorsi vengono congelati dopo l'avvio della JVM?Aggiunta di nuovi percorsi per le librerie native in fase di esecuzione in Java
risposta
Sembra impossibile senza poco di hacking (vale a dire l'accesso ai campi privati della classe ClassLoader)
Questo blog offrono 2 modi per farlo.
Per la cronaca, ecco la versione breve.
Opzione 1: sostituire completamente java.library.path con il nuovo valore)
public static void setLibraryPath(String path) throws Exception {
System.setProperty("java.library.path", path);
//set sys_paths to null so that java.library.path will be reevalueted next time it is needed
final Field sysPathsField = ClassLoader.class.getDeclaredField("sys_paths");
sysPathsField.setAccessible(true);
sysPathsField.set(null, null);
}
Opzione 2: aggiungere un nuovo percorso per la corrente java.library.path
/**
* Adds the specified path to the java library path
*
* @param pathToAdd the path to add
* @throws Exception
*/
public static void addLibraryPath(String pathToAdd) throws Exception{
final Field usrPathsField = ClassLoader.class.getDeclaredField("usr_paths");
usrPathsField.setAccessible(true);
//get array of paths
final String[] paths = (String[])usrPathsField.get(null);
//check if the path to add is already present
for(String path : paths) {
if(path.equals(pathToAdd)) {
return;
}
}
//add the new path
final String[] newPaths = Arrays.copyOf(paths, paths.length + 1);
newPaths[newPaths.length-1] = pathToAdd;
usrPathsField.set(null, newPaths);
}
davvero un bel compromesso :) grazie per averlo pubblicato. Non dovrebbe essere così hacky, probabilmente è difficile cambiare quel percorso per motivi di sicurezza, non è sicuro. Eviterò di farlo ma è bello sapere che esiste. – Sergio
La classe Field menzionata è: 'import java.lang.reflect.Field;' – Troyseph
Java9 registra una "operazione di accesso illecito illegale". – Stefan
http://stackoverflow.com/questions/2899804/setting-classpath-during-runtime –