用java中的System.loadLibrary()加载的.dll的搜索路径
What becomes the search path of a .dll loaded with System.loadLibrary() in java?
我有一个系统,其中有1个.exe文件、4个.dll文件和一个jar文件,其中的依赖项如下所示:
A.exe->调用->B.dll->通过JNIC.jar->调用System.loadLibrary("(->D.dll->调用E.dll
现在,B到E是一个模块,所有这些文件都在同一目录中A.exe是一个放置在不同目录中的应用程序,可以使用其中的几个模块。
我的主要问题是,当D.dll尝试加载E.dll时,我得到一个">找不到依赖库"java.lang.UnsaisfiedLinkError。如果我站在模块目录中手动运行C.jar,则不会出现这样的错误,并且D.dll能够加载E.dll。
因此,我的主要问题是:AddDllDirectory(%moduleDir%(在A.exe中运行,但它实际"继承"了多远?C.jar是否以某种方式删除了此函数添加的目录?在调用System.loadLibrary("(之前,是否有办法从java扩展dll搜索路径,以便加载的.dll继承此搜索路径?
- java.library.path设置为B.dll通过JNI启动JVM时的模块目录
- 我希望避免A.exe更改PATH环境变量
- D.dll或E.dll
提前感谢您的任何回答
这里是对您的案例中发生的错误的简短解释。
假设如下
- Java调用
System.loadLibrary("D");
,类在目录APP_DIR中 D.dll
依赖于目录DLL_DIR中的E.dll
情况1未指定的java.library.path
no D in java.library.path
情况2-Djava.library.path=%DLL_DIR%
D.dll: Can't find dependent libraries
因为Java检查%DLL_DIR%
中是否存在D.dll
,所以加载库(使用Windows LoadLibrary功能(。Windows尝试查找在PATH
中找不到且不在当前目录中的从属E.dll
。
情况3-Djava.library.path=%DLL_DIR%
和set PATH=%DLL_DIR%;%PATH%
System.loadLibrary("D"); will be successful
关于这个主题的一些附加链接
- MSDN"动态链接库搜索顺序">
- MSDN AddDllDirectory函数
- MSDN SetDllDirectory函数
- SetDllDirectory继承问题
- Python ctypes:不会按预期加载 dll
- 在 Linux 平台的 C++ 中动态加载 DLL
- 为什么 LoadLibrary 失败,而 LoadLibraryA 成功加载 DLL?
- 为什么有些延迟加载 DLL 会立即使用 FFMPEG 卸载?
- 了解加载库无法加载 DLL 的原因
- 应用程序仅在qt调试器中加载dll,而不是独立加载
- dll 生成成功,但在加载 dll 时执行错误
- QT 加载.dll不调用解析
- 通过重新加载DLL,避免使用DLL预加载漏洞,任何更好的方法
- 问题在具有依赖性时从其他路径上加载DLL的DLL
- C++插件不能延迟加载dll时
- Java加载DLL,该DLL从JNI中的另一个DLL导出方法
- C++ 动态加载 DLL 错误
- GHCi 无法在 Windows 上加载.dll lib(C++ lib)
- 使用C++应用程序加载 DLL
- System.DllNotFoundException:无法使用 dotnet core 加载 DLL
- 当应用程序在不同系统上运行时,无法加载DLL异常
- 如何停止二级IMPLICITLY加载DLL的DLL劫持
- 无法加载dll libglorycolx2010.dll.该应用程序未能启动,因为其并排配置不正确.Hresult:0x
- 如何在Acrobat JavaScript中加载DLL文件