2010-01-17 84 views
8

我在我的java应用程序中使用Jacob jar文件。如何在Java中配置.dll文件?

这个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) 
+0

更新了我的答案。 – 2010-01-17 20:00:29

+0

将dll放在windows的system32文件夹中解决了我的问题 – 2012-06-05 12:11:22

回答

5

阿目录,这不是一个编译错误,但运行时错误。

我的猜测是你的DLL需要在PATH上。不是CLASSPATH,但是PATH,因为这是Windows查找DLL的位置。尝试扩展PATH以包含DLL的位置,或者做许多其他人的操作:将DLL转储到\Winnt\System\System32或任何系统目录在您的盒子上调用。换句话说,无论其他所有DLL如何。

更新

您发布,值得庆幸的是,被指出确切的问题的错误消息。你可以通过把包含你的DLL的目录放入java.library.path来解决这个问题。这个太阳论坛线程显示了一个很好的例子:http://forums.sun.com/thread.jspa?threadID=627890

实际上,这比它应该少得多。这似乎是Java中“更加陡峭”的领域之一。线程徘徊了很多,我建议你阅读一下,看看一些问题和解决方案。我认为你可以通过一些试验和错误获得成功。

+0

是的,这是一个运行时错误。我错误地写了它。谢谢。 – 2010-01-17 18:48:46

+0

你能看看编辑过的问题吗? – 2010-01-17 19:40:00

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中运行。

+0

我的问题解决了。感谢那。 {...您可以将.dll文件放在您启动应用程序的目录中}您的意思是主类所在的目录?如果是,那么为什么如果我使用批处理脚本,文件应该位于批处理脚本所在的目录中? 当我想要在应用程序服务器中启动时,您能否介绍一下您的第一点,并更加关注点? – 2010-01-17 18:56:35

+0

你能看看编辑过的问题吗? – 2010-01-17 19:37:31

+0

它应该位于您开始Java过程的目录中,而不是您的主要类目录。 – 2010-01-18 01:11:38

1

您需要设置LD_LIBRARY_PATH。 This将为您提供遵循的所有正确步骤。

+1

这是假设他在Linux上运行,对吧? – 2010-01-17 18:52:07

+1

如果他在Linux上运行,JACOB将不会非常有用! – finnw 2010-02-08 14:41:16

+0

我假设有一个用于Linux的.so。相同的评论适用。 – duffymo 2014-09-03 22:07:26

3

其他选项:

  • 一套物业的java.library.path到包含DLL的目录。示例: java -Djava.library.path =“path/to/directory/contained/the/dll”-jar appli.jar
  • 在代码中,使用System.load显式加载dll。
+0

他们两个都不工作。 – 2010-01-17 19:50:18

0

我有同样的问题。

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

我最后的一个假设是Jacob.dll缺少它的依赖关系。

我所做的就是得到depend并检查Jacob所使用的所有依赖性是否都加载完毕。 当然这适用于Windows。

干杯!

1

当您使用System.loadLibrary()不包括.dll末尾

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