2013-03-14 12 views
5

È 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

+0

http://stackoverflow.com/questions/2899804/setting-classpath-during-runtime –

risposta

19

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); 
} 
+1

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

+0

La classe Field menzionata è: 'import java.lang.reflect.Field;' – Troyseph

+0

Java9 registra una "operazione di accesso illecito illegale". – Stefan

Problemi correlati