【问题标题】:Can one modify the "path" in a java process for loadLibrary() on windows?可以在 Windows 上为 loadLibrary() 修改 java 进程中的“路径”吗?
【发布时间】: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 在搜索进程的路径元素之前先从它的文件夹加载它的依赖项?

【问题讨论】:

    标签: java dll


    【解决方案1】:
    • 一般情况下,您不能在 JVM 启动后更改“java.library.path”(有一些 dirty tricks 使用反射来做到这一点,但最好不要)。
    • 您可以使用String archDataModel = System.getProperty("sun.arch.data.model"); 来确定您的JVM 是32 位还是64 位。
    • 您可以使用自定义ClassLoader 和修改后的findLibrary 方法从正确的位置加载库。但是,这让您只为加载的库本身指定路径,而不为它的依赖项指定路径。您只能通过更改 PATH 环境变量或更改当前目录来更改依赖项。

    【讨论】:

      猜你喜欢
      • 2012-02-13
      • 1970-01-01
      • 1970-01-01
      • 2022-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多