gpt4 book ai didi

java - 可以在Windows上的loadLibrary()的java进程中修改 "path"吗?

转载 作者:太空宇宙 更新时间:2023-11-04 10:51:24 28 4
gpt4 key购买 nike

也许又是一个“无法完成”的问题:)

我有一个可以构建为 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/

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