我的java应用程序依赖于DLL,而进一步的DLL依赖于defaultValue
。
我试图:
libstdc++-6.dll
放入文件夹然后在从Eclipse启动应用程序时遇到libstdc++-6.dll
。
但如果我将java.lang.Unsatisfied LinkError: The specified procedure could not be found
放入libstdc++-6.dll
,请说JDK's bin folder
。它工作正常。
但我不想污染JDK文件夹。我记得Windows会搜索%PATH%来定位依赖的DLL。为什么我不能在这个问题上使用%PATH%?
Windows中有2个不同的%PATH%环境变量。
我只是意外地发现:
如果我将DLL的文件夹放到User%PATH%,则无法找到它。
如果我把DLL的文件夹放到System%PATH%,它就可以了。
为什么?
我开始怀疑我的用户%Path%可能太长。所以我将包含我的依赖DLL的文件夹路径从User%PATH%的 end 移动到开头。它现在有效!
首先,我得出结论,实现Windows的DLL查找算法的人有一些截断问题。我几乎认为它是另一个恼人的Windows Bug。
但是我编写了另一个具有类似DLL依赖关系的Windows应用程序来确认我的猜测。该应用程序工作正常!所以我必须回顾一下我的结论。
我逐个检查了我的用户%PATH%条目,并将文件夹放在每个可能的位置。最后,我找到根本原因。
我在User%PATH%中有一个
C:\Java\jdk1.6.0_45_32bit\bin
条目,恰好包含一个C:\MinGW\bin
但不幸的是,这是不兼容的 与我需要的libstdc++-6.dll (977KB)
。它只适用于我在MinGW之前放置我的文件夹。所以它实际上是在%PATH%分辨率下的DLL冲突。
现在这个问题似乎已经解决了。但是另一个问题出现了,如果我想同时使用我的DLL和MinGW,我是否需要来回切换?
请查看@AndyThomas的评论。他提到将(825KB)
用于直接和间接DLL。这样,我们需要关心的是System.loadLibrary()
属性。我认为这是一个一劳永逸的解决方案。
答案 0 :(得分:2)
首先:将您需要的所有DLL文件放在同一目录中
然后:加载本机库 - 为此您有3个选项:
-Djava.library.path =“C:\你的目录,其中Dll是 本“
示例:
java -Djava.library.path =“C:\你的目录,其中Dll是 提出“-jar app.jar
a)将包含文件aaa.dll的目录直接放在Java项目下。
b)并将此行放在应用的堆栈跟踪顶部: System.loadLibrary(“aaa”)
System.setProperty(“java.library.path”,“C:\你的目录,其中Dll是 现在“);