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

标签 java dll

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

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

相关文章:

java - 数组作为实例变量作为参数传递

java - 在Android中通过httpost发送字节数组

java - Stream.count() 与 Collectors.counting() 有什么区别

java - 无法理解 Spring Boot 代码流程

java - 将 Gradle 项目导入 Eclipse 时出错

dll - 如何在Tcl中加载dll?

visual-c++ - DLL 的 "image version"有何用途(使用/VERSION Visual C++ 链接器开关设置)?

dll - 2017 年 2 月 15 日之后,Payflow_dotNET.dll 是否不再适用于 Payflow Pilot 测试端点 pilot-payflowpro.paypal.com

c# - 从 Powershell 调用的 DLL 使用相对于 Powershell 安装目录的路径。我怎样才能将它设置为其他东西?

linux - 加载前检查 Linux 共享对象的签名