也许又是一个“无法完成”的问题:)
我有一个可以构建为 32 位或 64 位的 Java 应用程序。我想在同一台机器上构建和测试两个版本。
我有一个需要加载的 native 库(实际上是一组 DLL),它是在两个目录中构建和输出的。
.../x64/.dll .../x32/.dll
“...”部分在java“java.library.path”中设置
在应用程序启动时,代码执行以下操作:
try {
System.loadLibrary("x32/native-library");
libraryLoaded_ = true;
} catch(Throwable e) {
try {
System.loadLibrary("x64/native-library");
libraryLoaded_ = true;
} catch(Throwable t) {
log.debug("failed to load module " + e); // : \"" + path + "\".",e);
log.debug(" or win8 module " + t); // : \"" + path + "\".",e);
}
}
这(部分)有效,因为当程序编译为 java 64 位时,加载 32 位库将失败,然后它将尝试 64 位版本。
然而,native-library.dll 依赖于与自身位于同一文件夹中的其他 DLL,但除非该目录位于 java 进程的系统路径环境变量中,否则它们不会解析。
但是,如果 x32 和 x64 目录都在系统路径中,并且两者中的 dll 具有相同的名称,则加载哪个相关 DLL 会产生歧义。
我想让 native-library.dll 首先从它所在的文件夹加载它的依赖项。
我怎样才能做到这一点? java.library.path 似乎对显式加载的库的依赖 dll 的加载没有影响。
我认为在调用“loadLibrary”之前我需要以某种方式修改java应用程序进程中的路径以包含 native 库的位置。
可以在应用程序代码中执行此操作吗? 有没有办法让 loadLibrary 加载的 dll 在搜索进程的路径元素之前先从其文件夹加载依赖项?
最佳答案
- 一般来说,在 JVM 启动后你不能改变“java.library.path”(有一些 dirty tricks 使用反射来做到这一点,但最好不要)。
- 您可以使用
String archDataModel = System.getProperty("sun.arch.data.model");
来确定您的 JVM 是 32 位还是 64 位。 - 您可以使用自定义
ClassLoader
和修改后的findLibrary
方法从正确的位置加载库。但是,这允许您仅指定加载的库本身的路径,而不是其依赖项的路径。您只能通过更改 PATH 环境变量或更改当前目录来更改依赖项。
关于java - 可以在Windows上的loadLibrary()的java进程中修改 "path"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47800657/