可以在Windows上为loadLibrary()修改java进程中的“路径”吗?

问题描述 投票:1回答:1

也许另一个“它无法完成”的问题:)

我有一个Java应用程序,可以构建32位或64位。我想在同一台机器上构建和测试两个版本。

我有一个本地库需要加载(真正的DLL集),这些库是在两个目录中构建和输出的。

.../小64/.DLL .../小32/.DLL

“...”部分在java“java.library.path”中设置

在app启动时,代码执行:

    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依赖于与其自身位于同一文件夹中的其他DLLS,但除非java进程的系统路径环境变量中的该目录,否则它们将无法解析。

但是,如果x32和x64目录都在系统路径中,并且两者中的dll具有相同的名称,则依赖于DLL的加载方式存在歧义。

我想让native-library.dll首先从它所驻留的文件夹中加载它的依赖项。

我怎么能做到这一点? java.library.path似乎对正在加载的库的依赖dll的加载没有影响。

我想我需要以某种方式修改java应用程序进程中的路径,以便在调用“loadLibrary”之前包含本机库的位置。

是否可以在应用程序代码中执行此操作?在搜索进程的路径元素之前,是否有任何方法可以使loadLibrary加载dll首先从它的文件夹加载它的依赖项?

java dll
1个回答
0
投票
  • 一般情况下,你不能在JVM启动后改变“java.library.path”(有一些dirty tricks使用反射来做,但最好不要)。
  • 您可以使用String archDataModel = System.getProperty("sun.arch.data.model");来确定您的JVM是32位还是64位。
  • 您可以使用自定义ClassLoader和修改后的findLibrary方法从正确的位置加载库。但是,这只是为加载的库本身指定路径,而不是为它的依赖项指定路径。您只能通过更改PATH环境变量或更改当前目录来更改依赖关系。
© www.soinside.com 2019 - 2024. All rights reserved.