1

我已经将一些 JNI 挂钩写入 C++ 库,并为我的 java 服务器项目创建了一些 DLL 文件。假设 DLL 和 jar 文件位于“C:/server”下的同一文件夹中

我正在使用以下方式访问这些 DLL 文件:

System.loadLibrary("someDLLFile");

在需要 C++ 代码的类中。

我遇到的问题是当我在自己的机器上运行此服务器时,无论我将“服务器”文件夹放在哪里,一切都正常。但是当我把它交给同事测试时,他们不断得到:

java.lang.UnsatisfiedLinkError no someDLLFile in java.library.path

我想让 DLL 文件与 jar 文件位于同一文件夹中,并且不希望有人配置他们的 PATH 变量。

为什么无论文件夹的位置如何,System.loadLibrary() 都可以在我自己的机器上工作,但不能在另一台计算机上工作?

4

4 回答 4

4

它之所以有效,是因为 DLL(或它所依赖的 DLL,即 msvcr90.dll 或其他东西)在您机器上的 PATH 中,但不在另一台机器上。

设置 PATH env-var 或 java.library.path 属性以包含您的文件的目录,或者将您的 dll 存储在 java 默认找到它的位置(这里有很多选项,取决于部署策略和平台)。

于 2009-06-22T21:50:56.530 回答
1

一种选择是在启动 VM 时在命令行中指定目录:

java -classpath C:\server -Djava.library.path=C:\server somePackage.Main

另一种选择是使用System.load而不是System.loadLibrary.

URL url = Test.class.getResource("someDLLFile.dll");
String f = new File(url.getFile()).getAbsolutePath();
System.load(f);

缺点是您的程序现在正在处理依赖于平台的目录名称、文件扩展名等。

于 2009-06-22T22:41:17.723 回答
0

我不确定这是否有用,但我在一些项目中包含以下内容:

http://forums.sun.com/thread.jspa?threadID=707176

加载本机库。

然后我只加载 bin 目录

    String binPath = new File(".").getAbsolutePath() 
                     + System.getProperty("file.separator") + "bin";

   addDir( binPath );

它工作得很好。

但同样,我不确定是否是这种情况。

于 2009-06-22T22:50:31.730 回答
0

尝试下载depends.exe,看看这个dll是否依赖于系统上的其他dll。如果是,则检查另一台机器,是否在 Path 中存在此类 dll。

于 2015-11-12T15:42:53.083 回答