gpt4 book ai didi

java - 在 Java 运行时为 native 库添加新路径

转载 作者:搜寻专家 更新时间:2023-10-30 21:17:44 25 4
gpt4 key购买 nike

是否可以在运行时为本地库添加新路径?。(而不是使用属性 java.library.path 启动 Java),因此在尝试查找 nativeLibraryName 时调用 System.loadLibrary(nativeLibraryName) 将包含该路径。这是可能的,还是一旦 JVM 启动,这些路径就被卡住了?

最佳答案

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

如果不进行一些黑客攻击(即访问 ClassLoader 类的私有(private)字段),这似乎是不可能的

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

关于java - 在 Java 运行时为 native 库添加新路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15409223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com