2010-03-30 92 views
4

我有一个应用程序使用.jar中调用.dll的方法。这在我的机器上工作正常(当应用程序解包或以.jar本身运行时),但是当application.jar在另一台机器上运行时,系统路径中的外部.dll文件无法运行dll文件。如何引用.jar文件中的.dll

.dll是否必须位于任何特殊位置?我认为,因为它在系统路径上会被发现。

在此先感谢

Dougie

+0

也许在ClassPath上,但我并不真正知道...... – 2010-03-30 16:01:38

+1

您是否可以添加有关正在使用的操作系统的更多信息?此外,Java代码是简单使用JNI还是使用某种平台特定的技术(如使用J-Integra加载COM库)?最后,你是否尝试过简单地将DLL文件和JAR文件放在同一个目录中? – 2010-03-30 16:02:17

回答

0

我建议把它在同一文件夹作为您的应用程序。话虽如此,“它无法运行dll文件”有点模糊......你确定它不是一个问题,因为其他DLL是不同的版本(因此不能正确加载,而不是在所有)?

此外,库搜索路径由java.library.path parameter定义。

0

确定您正在使用Sun JVM,可以通过在命令行上设置Java库路径来在命令行中指定本地库的位置。

这可以通过选择“-Djava.library.path = DLL目录”

它可以取决于库是如何在Java源代码加载完成。你有访问这个吗?你能发布代码吗?

如果java代码使用System.load(字符串),它会期望dll的完整路径。

如果它使用System.loadLibrary(String),它只需要库名称并将在java.library.path参数指定的位置进行搜索。

1

尝试使用:

File dll = new File([...]);

System.load(dll.getAbsolutPath());

我会打包DLL在同一目录下的jar归档。

3

java.library.path解决方案并不总是很好:在许多情况下,您无法更改JVM参数。更好的解决方案:

1)已经提到:把DLL在同一目录下JAR,不幸的是它使得这种JAR的使用难度 - 现在JAR不仅仅是一个JAR,但伴随DLL

2)将JAR作为正常资源放入JAR中,在JAR启动过程中将该DLL抽取到某处,例如$ TMP,然后像上面一样使用System.load(new File(...))。然后这个JAR只是一个JAR,这个JAR的用户甚至可能不知道它使用任何DLL

您也可以使用Maven NAR插件,如果您使用Maven构建版本,这非常强大。请参阅http://duns.github.com/maven-nar-plugin/