Agregar nuevas rutas para bibliotecas nativas en tiempo de ejecución en Java

¿Es posible agregar una nueva ruta para bibliotecas nativas en tiempo de ejecución? (En lugar de iniciar Java con la propiedad java.library.path), una llamada a System.loadLibrary(nativeLibraryName) incluirá esa ruta cuando intente encontrar nativeLibraryName . ¿Es eso posible o estas rutas se congelan una vez que la JVM ha comenzado?

    Parece imposible sin poca piratería (es decir, acceder a campos privados de la clase ClassLoader)

    Este blog proporciona 2 formas de hacerlo.

    Para el registro, aquí está la versión corta.

    Opción 1: reemplace completamente java.library.path con el nuevo valor)

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

    Opción 2: agregue una nueva ruta a la actual 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); }