JNI DLL如何搜索其依赖的本机DLL?

smw*_*dia 5 c++ java dll java-native-interface dynamic-linking

说我有JNI.dll.这取决于native.dll.现在我的Java应用程序调用System.loadLibrary("JNI").

以下文件夹布局是否有效?

MainFolder
    |--main.exe
    |--SubFolder
          |--JNI.dll
          |--native.dll
Run Code Online (Sandbox Code Playgroud)

我的猜测是,有两个级别的依赖解析.

[1级]:

System.loadLibrary("JNI")使用JVM属性java.library.path来定位JNI.dll.

[等级2]:

JNI.dll依靠Windows系统机制来定位native.dll.

它是否正确?

如果我设置%_JAVA_OPTIONS%-Djava.library.path=MainFolder\SubFolder,我认为它可以涵盖搜索JNI.dll.但它也会覆盖搜索native.dll吗?

添加1

似乎我从这里确认了2个级别的猜测:如何在Eclipse启动时将本机库添加到"java.library.path"(而不是覆盖它)

请参阅kevin cline的评论.但是上面提到的LD_LIBRARY_PATH环境变量解决方案仅适用于Linux.

添加2

我想我没有说清楚我的问题.让我这样说吧.

我的困惑是:JNI.dll取决于native.dll.两个人都没有main.exe"当前工作目录.实际上它们位于CWD的子文件夹中.

如果我main.exe直接跑,我只需要设置java.library.path = <other path>\MainFolder\SubFolder.两个DLL都可以正确找到.

但是如果我从Eclipse运行我的项目,除了设置之外java.library.path,我必须将"\ MainFolder\SubFolder"放在%PATH%环境变量中.

我只是不知道为什么Eclipse如此不同.

smw*_*dia 1

类似的链接:我必须将所有依赖的 DLL 放入 JDK 的 bin 文件夹中吗?

受到此线程的启发:系统与用户 PATH 环境变量...只有当我将路径添加到用户 PATH 时,winmerge 才起作用

我开始怀疑我的用户%Path%是否太长。因此,我将包含我的依赖 DLL 的文件夹路径从User %PATH% 的末尾移至开头。现在可以了!

首先,我得出的结论是,实现 Windows DLL 查找算法的人存在一些截断问题。我几乎认为这是另一个令人讨厌的 Windows Bug。

但我编写了另一个具有类似 DLL 依赖项的 Windows 应用程序来证实我的猜测。该应用程序运行良好!所以我必须回顾我的结论。

我一一检查了我的 User %PATH% 条目,并将该文件夹放置到每个可能的位置。最后,我找到了根本原因

C:\MinGW\bin在 User %PATH% 中有一个条目,它恰好包含 a libstdc++-6.dll (977KB)但不幸的是,它与我需要的不兼容(825KB)。仅当我将文件夹放在 MinGW 之前时它才有效。

现在这个问题似乎已经解决了。但又出现了一个问题,如果我想同时使用 DLL 和 MinGW,是否需要来回切换?