我是否必须将所有相关的DLL放入JDK的bin文件夹中?
我的Java应用程序依赖于DLL,而该DLL 依赖于libstdc++-6.dll
。
我试过了:
- 将放置
libstdc++-6.dll
在文件夹中 - 并将文件夹放在%PATH%
然后,我遇到了java.lang.Unsatisfied LinkError: The specified procedure could not be
found从Eclipse启动应用程序时的问题。
但是如果我把它libstdc++-6.dll
放进去了JDK's bin
folder,就说C:\Java\jdk1.6.0_45_32bit\bin
。它工作正常。
但是我不想污染JDK文件夹。我记得Windows会搜索%PATH%来找到依赖的DLL。为什么在此问题中不能使用%PATH%?
回答:
Windows中有2个不同的%PATH%环境变量。
- 用户变量
- 系统变量
我只是 发现:
如果我将DLL的文件夹放置到User%PATH%,则找不到该文件夹。
如果我将DLL的文件夹放入系统%PATH%,它将起作用。
为什么?
回答:
受此线程的启发:系统与用户PATH环境变量…仅当我将路径添加到用户PATH时,winmerge才起作用
我开始怀疑也许我的用户%Path% 。因此,我将包含依赖的DLL的文件夹路径从User%PATH%的 移到了
。现在可以使用!
首先,我得出结论,实现Windows DLL查找算法的人有一些截断问题。而且我 几乎 认为它是另一个令人讨厌的Windows Bug。
但是我写了另一个具有类似DLL依赖关系的Windows应用程序,以证实我的猜测。该应用程序运行良好!因此,我必须回顾我的结论。
我一步一步检查了我的用户%PATH%条目,并将文件夹放置在每个可能的位置。最后,我找到了 。
我
C:\MinGW\bin
在User%PATH%中有一个条目,该条目恰好包含一个,libstdc++-6.dll
(977KB)但不幸的是,它与我需要的条目
不兼容
(825KB)
。仅当我将文件夹放在MinGW之前,它才有效。因此,实际上是%PATH%解析期间的DLL冲突。
现在,此问题似乎已解决。但是出现另一个问题,如果我要同时使用DLL和MinGW,是否需要来回切换?
回答:
请检查@AndyThomas的评论。他提到同时使用System.loadLibrary()
直接和间接DLL。这样,我们只需要关心java.library.path
财产。我认为这是千篇一律的解决方案。
回答:
第一:将所需的所有DLL文件放在同一目录中
然后:加载本机库-为此,您有3个选择:
- 在运行应用程序时设置VM选项。
-Djava.library.path =“ C:\您的Dll存在的目录”
例:
java -Djava.library.path =“ C:\您存在Dll的目录” -jar app.jar
- 从应用程序内加载特定的本机库:
a)将包含文件aaa.dll的目录直接放在Java项目下。
b)并将此行放在应用程序的堆栈跟踪的顶部:
- 在应用程序内使用VM选项:
System.setProperty(“ java.library.path”,“ C:\您的Dll所在的目录”);
以上是 我是否必须将所有相关的DLL放入JDK的bin文件夹中? 的全部内容, 来源链接: utcz.com/qa/405222.html