我必须将所有相关DLL放入JDK的bin文件夹中吗?

时间:2015-04-27 08:50:48

标签: java dll java-native-interface

我的java应用程序依赖于DLL,而进一步的DLL依赖于defaultValue

我试图:

  • libstdc++-6.dll放入文件夹
  • 并将文件夹放在%PATH%

然后在从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%?

更新1

Windows中有2个不同的%PATH%环境变量。

  • 用户变量
  • 系统变量

我只是意外地发现:

  • 如果我将DLL的文件夹放到User%PATH%,则无法找到它。

  • 如果我把DLL的文件夹放到System%PATH%,它就可以了。

为什么?

更新2

受此主题启发:System versus user PATH environmental variable...winmerge works only if I add the path to the user 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,我是否需要来回切换?

更新3

请查看@AndyThomas的评论。他提到将(825KB)用于直接和间接DLL。这样,我们需要关心的是System.loadLibrary()属性。我认为这是一个一劳永逸的解决方案。

1 个答案:

答案 0 :(得分:2)

首先:将您需要的所有DLL文件放在同一目录中

然后:加载本机库 - 为此您有3个选项:

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

    -Djava.library.path =“C:\你的目录,其中Dll是   本“

    示例:

      

    java -Djava.library.path =“C:\你的目录,其中Dll是   提出“-jar app.jar

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

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

           

      b)并将此行放在应用的堆栈跟踪顶部: System.loadLibrary(“aaa”)

      1. 在您的应用中使用VM选项:
      2.   

        System.setProperty(“java.library.path”,“C:\你的目录,其中Dll是   现在“);