我已经写了一些JNI钩入C ++库,并创造了一些DLL文件我的Java服务器项目。 比方说,DLL和jar文件在同一文件夹下的“C:/服务器”
我访问使用这些DLL文件:
System.loadLibrary("someDLLFile");
在需要的C ++代码的类。
我遇到的问题是,当我在我自己的机器上运行该服务器,一切正常,无论在哪里,我把“服务器”文件夹中。 但是,当我把它交给同事去测试,他们不断地得到:
java.lang.UnsatisfiedLinkError no someDLLFile in java.library.path
我想有DLL文件住在同一个文件夹中的jar文件,宁愿没有人配置他们的PATH变量。
为什么的System.loadLibrary()我自己的机器上工作,不管文件夹的位置,而不是另一台计算机上?
它的工作原理,因为DLL(或它依赖于一个DLL,即MSVCR90.DLL或东西)是在你的机器上的路径,但不是在另一个。
无论是设置PATH环境-VAR或财产的java.library.path遏制dir用的文件,或保存您的DLL,其中的Java默认发现它(这里的许多选择,具体取决于部署策略和平台)。
一种选择是,当您启动虚拟机指定命令行的目录:
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文件是否存在或不路径。