gpt4 book ai didi

java - 我必须将所有依赖的 DLL 放入 JDK 的 bin 文件夹中吗?

转载 作者:行者123 更新时间:2023-11-30 08:53:08 26 4
gpt4 key购买 nike

我的 java 应用程序依赖于一个 DLL,而该 DLL 进一步依赖于 libstdc++-6.dll

我尝试过:

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

然后我在从 Eclipse 启动应用程序时遇到 java.lang.Unsatisfied LinkError: The specified procedure could not be found

但是如果我将 libstdc++-6.dll 放入 JDK 的 bin 文件夹,比如 C:\Java\jdk1.6.0_45_32bit\bin。它工作正常。

但是我不想污染JDK文件夹。我记得 Windows 会搜索 %PATH% 来定位相关的 DLL。为什么我不能在这个问题中使用 %PATH%?

更新1

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

  • 用户变量
  • 系统变量

我只是不小心发现:

  • 如果我把 DLL 的文件夹放到 User %PATH%,就找不到了。

  • 如果我将 DLL 的文件夹放到系统 %PATH%,它就可以工作。

为什么?

更新2

受此主题的启发:System versus user PATH environmental variable...winmerge works only if I add the path to the user PATH

我开始怀疑我的 User %Path% 是否太长。因此,我将包含我的依赖 DLL 的文件夹路径从 User %PATH% 的end 移动到beginning。现在可以用了!

首先,我得出结论,实现 Windows 的 DLL 查找算法的人存在一些截断问题。我几乎认为它是另一个烦人的 Windows 错误。

但我写了另一个具有类似 DLL 依赖关系的 Windows 应用程序来证实我的猜测。该应用程序工作正常!所以我必须重新审视我的结论。

我一一检查了我的用户 %PATH% 条目,并将文件夹放在每个可能的位置。最后,我找到了根本原因

I have a C:\MinGW\bin entry in User %PATH%, which happens to contain a libstdc++-6.dll (977KB) but unfortunately, which isn't compatible with the one I need (825KB). It only works if I place my folder before MinGW. So it's actually DLL collision during %PATH% resolution.

现在这个问题似乎已经解决了。但是另一个出现了,如果我想同时使用我的 DLL 和 MinGW,是否需要来回切换?

更新3

请查看@AndyThomas 的评论。他提到对直接和间接 DLL 使用 System.loadLibrary()。这样,我们只需要关心 java.library.path 属性即可。我认为这是一劳永逸的解决方案。

最佳答案

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

然后:加载 native 库 - 为此,您有 3 个选择:

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

-Djava.library.path="C:\Your Directory where Dll ispresent"

例子:

java -Djava.library.path="C:\Your Directory where Dll ispresent" -jar app.jar

  1. 从应用内加载特定的 native 库:

a) Place the directory that contains the file aaa.dll directly under the Java project.

b) And place this line on the top of stack trace of your app: System.loadLibrary("aaa")

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

System.setProperty( "java.library.path", "C:\Your Directory where Dll ispresent" );

关于java - 我必须将所有依赖的 DLL 放入 JDK 的 bin 文件夹中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29891114/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com