我是否必须将所有相关的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个选择:

  1. 在运行应用程序时设置VM选项。

-Djava.library.path =“ C:\您的Dll存在的目录”

例:

java -Djava.library.path =“ C:\您存在Dll的目录” -jar app.jar

  1. 从应用程序内加载特定的本机库:

a)将包含文件aaa.dll的目录直接放在Java项目下。

b)并将此行放在应用程序的堆栈跟踪的顶部:

  1. 在应用程序内使用VM选项:

System.setProperty(“ java.library.path”,“ C:\您的Dll所在的目录”);

以上是 我是否必须将所有相关的DLL放入JDK的bin文件夹中? 的全部内容, 来源链接: utcz.com/qa/405222.html

回到顶部