我已经将一些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()在我自己的机器上运行,而不管文件夹的位置如何,而不是在另一台计算机上?

有帮助吗?

解决方案

它的工作原理是因为DLL(或它依赖的DLL,即msvcr90.dll或其他东西)在你机器上的PATH中,但在另一个上没有。

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

其他提示

一种选择是在启动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);

缺点是您的程序现在正在处理与平台相关的目录名,文件扩展名等。

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

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

加载本机库。

然后我只加载bin目录

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

   addDir( binPath );

效果很好。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top