2013-03-14 31 views
5

是否可以在运行时为本机库添加新路径? (而不是使用属性java.library.path启动Java),因此在尝试查找nativeLibraryName时,调用System.loadLibrary(nativeLibraryName)将包含该路径。 这是可能的,或者这些路径在JVM启动后被冻结?在Java中运行时为本机库添加新路径

+0

http://stackoverflow.com/questions/2899804/setting-classpath-during-runtime – 2013-03-14 12:35:30

回答

19

这似乎是不可能没有一点的黑客(即访问ClassLoader类的私有字段)

blog提供这样做的2种方式。

备案,这里是简短的版本。

选项1:用新的值完全取代的java.library.path)

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

选项2:添加新的路径,以当前的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

确实相当黑客:)感谢张贴它。它不应该是那种黑客行为,出于安全原因可能很难改变这条道路,不确定。我会避免这样做,但很高兴知道它存在。 – Sergio 2013-03-14 12:40:50

+0

提到的Field类是:'import java.lang.reflect.Field;' – Troyseph 2014-10-20 12:09:08

+0

Java9记录一个“非法反射访问操作”。 – Stefan 2017-12-12 09:46:04

相关问题