加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

在Java中在运行时为本机库添加新路径

发布时间:2020-12-15 07:37:58 所属栏目:Java 来源:网络整理
导读:是否可以在运行时为本机库添加新路径? (而不是使用属性 java.library.path启动 Java),因此在尝试查找nativeLibraryName时,对System.loadLibrary(nativeLibraryName)的调用将包含该路径. 这是可能的,或者这些路径在JVM启动后被冻结了吗? 解决方法 [此解决方
是否可以在运行时为本机库添加新路径?
(而不是使用属性 java.library.path启动 Java),因此在尝试查找nativeLibraryName时,对System.loadLibrary(nativeLibraryName)的调用将包含该路径.
这是可能的,或者这些路径在JVM启动后被冻结了吗?

解决方法

[此解决方案不适用于Java 10]

没有少量黑客攻击似乎是不可能的(即访问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);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读