JNI DLL如何搜索其依赖的本机DLL
How does a JNI DLL search for its dependent native DLL?
假设我有JNI.dll
。这取决于native.dll
。现在我的Java应用程序调用System.loadLibrary("JNI")
。
以下文件夹布局是否有效?
MainFolder
|--main.exe
|--SubFolder
|--JNI.dll
|--native.dll
我的猜测是,依赖性解析有两个级别。
【1级】:
System.loadLibrary("JNI")
使用JVM属性java.library.path
来定位JNI.dll
。
【2级】:
JNI.dll
依赖于Windows系统机制来定位native.dll
。
这是正确的吗?
如果我将%_JAVA_OPTIONS%
设置为-Djava.library.path=MainFolderSubFolder
,我认为它可以覆盖对JNI.dll
的搜索但它也会覆盖对native.dll
的搜索吗
添加1
我对两个层次的猜测似乎从这里得到了证实:如何将原生库添加到"java.library.path";Eclipse启动(而不是覆盖它)
参见凯文·克林的评论。但上述带有LD_LIBRARY_PATH
环境变量的解决方案仅适用于Linux。
添加2
我想我没有把问题说清楚。让我这样说吧。
我的困惑是:JNI.dll
依赖于native.dll
这两个都而不是在main.exe
的当前工作目录中。实际上,它们在CWD的一个子文件夹中。
如果我直接运行main.exe
,我只需要设置java.library.path = <other path>MainFolderSubFolder
。两个DLL都已正确找到。
但是,如果我从Eclipse运行我的项目,除了设置java.library.path
之外,我还必须将"\MainFolder\SubFolder"放在%PATH%环境变量中。
我只是不知道为什么Eclipse如此不同。
1)它在当前目录中搜索。
2) 系统文件夹通常为C:\Windows\System32(使用CSIDL_System和shgetspecialfolderpath()
在给定系统上获得正确的文件夹)
3) Windows文件夹(C:\Windows)(CSIDL_Windows与shgetspecialfolderpath()
在给定系统上获得正确的文件夹)
4) PAth环境变量下列出的所有文件夹
类似的链接:我必须将所有依赖的DLL放入JDK';s的bin文件夹?
受此线程启发:系统与用户PATH环境变量。。。winmerge只有在我将路径添加到用户path 时才有效
我开始怀疑我的用户%Path%是否太长。因此,我将包含我的依赖DLL的文件夹路径从用户%path%的结尾移动到开头。它现在起作用了!
首先,我得出结论,一个实现Windows DLL查找算法的人有一些截断问题。我几乎认为这是另一个烦人的Windows Bug。
但我写了另一个Windows应用程序,它有类似的DLL依赖项来证实我的猜测。该应用程序运行良好!所以我必须重新审视我的结论。
我逐一检查了"用户%PATH%"条目,并将文件夹放在每个可能的位置。最后,我找到了的根本原因。
我在用户%PATH%中有一个
C:MinGWbin
条目,它恰好包含libstdc++-6.dll (977KB)
,但不幸的是,它不兼容和我需要的CCD_ 24。只有当我把文件夹放在MinGW之前时,它才有效。
现在这个问题似乎得到了解决。但另一个问题出现了,如果我想同时使用我的DLL和MinGW,我需要来回切换吗?
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 为什么<iostream>依赖MinGW dll?
- C++ API-MS-WIN-SERVICE-PRIVATE-L1-1-1.DLL依赖项问题
- CMake - 安装第三方 dll 依赖项
- Maven NAR插件:在路径上找不到DLL依赖项
- 使用Visual Studio 11 RC调试时找不到DLL依赖项
- C++DLL依赖状态模式
- 没有 DLL 依赖项的静态构建可执行文件
- DLL 依赖项版本冲突
- 在应用程序启动时松开 DLL 依赖项
- 在我的发布应用程序 (VC++ 2013) 中摆脱 msvcr120.dll/msvcp120.dll依赖项
- 如何强制DLL依赖,即使EXE没有直接使用任何符号
- 生成一个没有 dll 依赖项的C++二进制文件
- Windows上与Mingw的DLL依赖关系
- 有条件地跳过DLL依赖项
- /MT选项(MSVCR100.dll依赖项的静态链接)不适用于Visual Studio
- 从Windows二进制文件中删除msvcp90d.dll依赖
- 用于Windows的可移植C/ c++应用程序的DLL依赖
- Netbeans下没有DLL依赖Mingw
- 捕获Win32应用程序中的DLL依赖项