如何在Java中配置.dll文件?

8

我在我的Java应用程序中使用了Jacob jar文件。

这个Jacob jar文件带有一个.dll文件。我已经将Jacob jar文件添加到了我的类路径中。但是当我执行我的应用程序时,会出现运行时错误:

"couldn't load jacob-1.15-M3-x86.dll file"

我该如何加载这个.dll文件?

编辑:=================================================================================

我已经将"路径"环境变量设置为包含我的.dll文件的目录,并按照以下方式加载该.dll文件。

static {
    System.loadLibrary("jacob-1.15-M3-x86.dll");
}

但是发生了以下错误。
    java.lang.UnsatisfiedLinkError: no jacob-1.15-M3-x86.dll in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1734)
    at java.lang.Runtime.loadLibrary0(Runtime.java:823)
    at java.lang.System.loadLibrary(System.java:1028)
    at TemplateClass.TemplateClass.<clinit>(TemplateClass.java:14)

将dll文件放置在Windows的system32文件夹中解决了我的问题。 - Dungeon Hunter
6个回答

10

需要将“jacob-1.15-M3-x86.dll”文件放在操作系统可以找到的地方。您有几个选项:

  • 您可以将.dll文件放置在启动应用程序的目录中。如果您有一个批处理脚本来启动应用程序,那么它将是该目录。如果您在某种应用程序服务器中启动,则通常会是“bin”目录。

  • 您可以将.dll文件放置在%PATH%环境变量的某个位置。更新PATH环境变量以包括包含.dll文件的目录可能更容易。

  • 另一种选择是将.dll文件放入%SystemRoot%\system32目录中。通常这是“C:\Windows\system32”。除非它是像MSCVRT运行时这样的共享库,否则通常不建议使用此选项。

可能还有一个问题。如果.dll编译为32位,则必须在32位的Java运行时中运行。同样,如果是64位.dll,则需要在64位JRE中运行。


我的问题已经解决了。谢谢你。{...您可以将.dll文件放置在启动应用程序的目录中} 您是指主类所在的目录吗?如果是,那么如果我使用批处理脚本,为什么文件应该在批处理脚本所在的目录中?您能否详细解释一下您的第一个观点,重点是当我想要在应用程序服务器上启动时的情况? - Amit
它应该在你启动Java进程的目录中,而不是你的主类目录中。 - Chris Dail

5
啊,那不是编译错误,而是运行时错误。
我猜你的DLL需要在PATH上。不是CLASSPATH,而是PATH,因为这是Windows查找DLL的地方。尝试扩展您的PATH以包括DLL的位置,或者像许多其他人一样做:将DLL转储到 \Winnt\System\System32 或您的计算机上称为系统目录的任何其他地方。换句话说,就是所有其他DLL所在的地方。
更新
您发布的错误消息,幸运的是,指出了确切的问题。您可以通过将包含DLL的目录放入java.library.path来解决此问题。这个Sun论坛线程显示了一个很好的例子:http://forums.sun.com/thread.jspa?threadID=627890 实际上,这比它应该干净得多;这似乎是Java中“阴暗”区域之一。线程四处漫游,我建议您仔细阅读整个过程,以了解一些问题和解决方案。我认为您将能够通过一些试错来成功。

3

其他选项:

  • 将属性java.library.path设置为包含dll的目录。例如: java -Djava.library.path="包含dll的目录路径" -jar appli.jar
  • 在代码中,使用System.load显式加载dll。

1

您需要设置LD_LIBRARY_PATH。这里提供了所有正确的步骤供您参考。


1
如果他在Linux上运行,JACOB将不会很有用! - finnw
我假设在Linux上有一个.so文件。相同的评论适用。 - duffymo

1

当您使用System.loadLibrary()时,不要在末尾包含.dll

此外,如果您没有设置java.library.path指向包含DLL的文件夹,则DLL应该位于启动Java应用程序的目录中。


0

我曾经遇到过同样的问题。

我看到这个问题还没有“回答”,所以也许上面的选项都没有起作用。

我最后的一个假设是 Jacob.dll 缺少其依赖项。

我所做的就是获取 depend 并检查 Jacob 使用的所有依赖项是否已加载。 当然,这仅适用于 Windows。

干杯!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接