我已经将一些JNI钩子写入C ++库并为我的java服务器项目创建了一些DLL文件。可以说DLL和jar文件位于“C:/ server”
下的同一文件夹中我使用以下方法访问这些DLL文件:
System.loadLibrary("someDLLFile");
在需要C ++代码的类中。
我遇到的问题是当我在自己的机器上运行此服务器时,无论我放置“server”文件夹的位置,一切正常。但是当我把它交给同事测试时,他们会不断得到:
java.lang.UnsatisfiedLinkError no someDLLFile in java.library.path
我希望DLL文件与jar文件位于同一个文件夹中,并且不希望有人配置其PATH变量。
为什么System.loadLibrary()在我自己的机器上运行,而不管文件夹的位置如何,而不是在另一台计算机上?
答案 0 :(得分:4)
它的工作原理是因为DLL(或它依赖的DLL,即msvcr90.dll或其他东西)在你机器上的PATH中,但在另一个上没有。
设置PATH env-var或java.library.path属性以包含您的文件的dir,或者将您的dll存储在java默认找到的地方(这里有许多选项,具体取决于部署策略和平台)。
答案 1 :(得分: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);
缺点是您的程序现在正在处理与平台相关的目录名,文件扩展名等。
答案 2 :(得分:0)
我不确定这是否有用,但我在一些项目中包括以下内容:
http://forums.sun.com/thread.jspa?threadID=707176
加载本机库。
然后我只加载bin目录
String binPath = new File(".").getAbsolutePath()
+ System.getProperty("file.separator") + "bin";
addDir( binPath );
效果很好。
但同样,我不确定是否是这种情况。
答案 3 :(得分:0)
尝试下载depends.exe以查看dll是否依赖于系统上的其他dll。如果是,则检查另一台机器,在路径中是否存在这样的dll。