【发布时间】:2017-12-13 19:20:50
【问题描述】:
也许是另一个“无法完成”的问题:)
我有一个可以构建为 32 位或 64 位的 Java 应用程序。我想在同一台机器上构建和测试这两个版本。
我有一个需要加载的本地库(实际上是一组 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 应用程序进程中的路径以包含本机库的位置。
是否可以在应用程序代码中执行此操作? 有没有办法让 loadLibrary 加载的 dll 在搜索进程的路径元素之前先从它的文件夹加载它的依赖项?
【问题讨论】: