当前位置: 首页 > 面试题库 >

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

皇甫树
2023-03-14
问题内容

我的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%?

更新1

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

我只是 偶然 发现:

  • 如果我将DLL的文件夹放置到User%PATH%,则找不到该文件夹​​。

  • 如果我将DLL的文件夹放入系统%PATH%,它将起作用。

为什么?

更新2

受此线程的启发:系统与用户PATH环境变量…仅当我将路径添加到用户PATH时,winmerge才起作用

我开始怀疑也许我的用户%Path% 太长了 。因此,我将包含依赖的DLL的文件夹路径从User%PATH%的 末尾 移到了
begin 。现在可以使用!

首先,我得出结论,实现Windows DLL查找算法的人有一些截断问题。而且我 几乎 认为它是另一个令人讨厌的Windows Bug。

但是我写了另一个具有类似DLL依赖关系的Windows应用程序,以证实我的猜测。该应用程序运行良好!因此,我必须回顾我的结论。

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

C:\MinGW\bin在User%PATH%中有一个条目,该条目恰好包含一个,libstdc++-6.dll (977KB)但不幸的是,它与我需要的条目
不兼容(825KB)。仅当我将文件夹放在MinGW之前,它才有效。因此,实际上是%PATH%html" target="_blank">html" target="_blank">解析期间的DLL冲突。

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

更新3

请检查@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)并将此行放在应用程序的堆栈跟踪的顶部: System.loadLibrary(“ aaa”)

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

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



 类似资料:
  • null 然后,我遇到找不到指定的过程。 但是,如果我将放入中,那么可以说。很好用。 但是我不想污染JDK文件夹。我记得windows会搜索%Path%来定位依赖的DLL。为什么在此问题中我不能使用%path%? 用户变量 系统变量 我只是无意间发现: > 如果将DLL的文件夹放到用户%path%中,则找不到该文件夹。 但是我编写了另一个Windows应用程序,它有类似的DLL依赖关系来证实我的猜

  • 问题内容: 我已经使用$ .mobile.changepage在我的phonegap+jquerymobile项目中进行了重定向。但是,令我感到困惑的是,我需要将所有页面的脚本放在同一文件index.html中。否则,重定向页面将无法在其标题中执行该功能。 例如,我的index.html似乎是 然后,我的设备将重定向到似乎是 但是,该脚本将永远不会在test.html中执行。然后,将脚本放入ind

  • 我在独立应用程序中使用Maven,我想将所有依赖项打包到库文件夹中的JAR文件中,正如这里的答案之一所提到的: 如何使用Maven创建具有依赖项的可执行JAR? 我希望我的最终JAR文件有一个库文件夹,其中包含作为JAR文件的依赖项,而不是像那样将依赖项以文件夹的形式放在.m2文件夹中的Maven层次结构。 实际上,当前的配置符合我的要求,但在运行应用程序时,我在加载JAR文件方面遇到了问题。我不

  • 问题内容: 如何在node.js的文件夹中需要所有文件? 需要类似的东西: 问题答案: 给require给出文件夹的路径后,它将在该文件夹中寻找一个index.js文件。如果有一个,它会使用它,如果没有,它将失败。 如果您可以控制文件夹,那么创建一个index.js文件,然后分配所有“模块”,然后简单地要求就可以了。 yourfile.js index.js 如果您不知道文件名,则应该编写某种加载

  • 有一个spring boot应用程序,我尝试在S3目标存储桶的文件夹中放置一个文件。目标bucket/targetsystem文件夹/文件。csv 将从yml配置文件检索的每个文件的targetsystem文件夹名称将不同。 如果该文件夹未退出,则必须通过代码创建targetsystem文件夹,并将文件放在该文件夹下 据我所知,在S3桶中没有文件夹概念,所有文件都存储为对象。 阅读了一些文档,比如

  • 问题内容: 我使用的是用这样的: 我只关门了。我是否还需要关闭()? 问题答案: 不,您只需要关闭最外面的流。它将一直委托给包装的流。 但是,您的代码包含一个概念上的失败,应该在中发生关闭,否则当代码在打开和关闭之间引发异常时,它永远不会关闭。 例如 (请注意,我更改了代码以 引发 异常,以便您了解问题的原因,该异常即包含有关问题原因的详细信息) 或者,当您已经在使用Java 7时,也可以使用AR