Java 如何修复JNI项目中不满意的链接错误(无法找到依赖库)
我正在从事一个使用JNI的Java项目。JNI调用我自己编写的自定义库,比如mylib.dll,它依赖于第三方库libsndfile-1.dll 当我运行我的程序时,它会崩溃Java 如何修复JNI项目中不满意的链接错误(无法找到依赖库),java,windows-xp,java-native-interface,libsndfile,Java,Windows Xp,Java Native Interface,Libsndfile,我正在从事一个使用JNI的Java项目。JNI调用我自己编写的自定义库,比如mylib.dll,它依赖于第三方库libsndfile-1.dll 当我运行我的程序时,它会崩溃 java.lang.UnsatisfiedLinkError: C:\...path...\mylib.dll: Can't find dependent libraries. 我搜索了这个网站(和其他网站),并尝试了一些修复: 我跑了。DW给出了几个警告——libsndfile所需的两个库MPR.DLL和SHLWAP
java.lang.UnsatisfiedLinkError: C:\...path...\mylib.dll: Can't find dependent libraries.
我搜索了这个网站(和其他网站),并尝试了一些修复:
我在VisualStudio2010的MacBookPro上进行开发(通过Parallels)。我正在东芝笔记本电脑上用Windows XP进行测试。我很确定类路径和共享库搜索路径之间没有什么关系。根据(当然是旧的),在Windows上,如果不使用
java.library.path
系统属性,则DLL需要位于当前工作目录或Windowspath
环境变量中列出的目录中
更新: 看起来Oracle已经从其网站上删除了PDF。我已经更新了上面的链接,指向一个在德克萨斯大学生活的PDF实例-阿林顿。< /P> 此外,您还可以阅读Oracle的HTML版本的。它存在于Java网站的Java8部分,因此希望能存在一段时间
更新2: 至少在Java 8中(我没有检查早期版本),您可以执行以下操作:
java -XshowSettings:properties -version
查找共享库搜索路径。在该输出中查找
java.library.path
属性的值。我曾经遇到过完全相同的问题,最终解决了
我将所有依赖dll放在存储mylib.dll的同一文件夹中,并确保JAVA编译器能够找到它(如果编译路径中没有mylib.dll,则在编译过程中会出现错误报告)。您需要注意的重要一点是,您必须确保所有依赖lib与mylib.dll的版本相同,例如,如果您的mylib.dll是发布版本,那么您还应该将其所有依赖lib的发布版本放在那里
希望这能帮助其他遇到同样问题的人。我想告诉这个有趣的案例,在尝试了上述所有方法后,错误仍然存在。奇怪的是,它可以在Windows7计算机上运行,但在WindowsXP上却不行。然后我使用dependency walker,发现在Windows XP上没有VC++运行时作为我的dll要求。在安装了VC++运行时包之后,它就像一个魔咒。让我不安的是,它一直告诉我找不到依赖的库,而直观地看,依赖JNI的dll就在那里,但最终发现依赖JNI的dll需要另一个依赖的dl。我希望这能有所帮助。在安装
javacv
和opencv
与Eclipse结合使用时,在XP机器上确实存在相同的问题。结果发现我丢失了以下文件:
- msvcp100.dll
- msvcr100.dll
安装完这些后,项目编译并运行正常。请验证库路径是否正确。当然,您可以使用以下代码检查库路径:
System.out.println(System.getProperty(“java.library.path”)代码>
启动java应用程序时,可以指定java.library.path:
java -Djava.library.path=path ...
您需要加载JNI库
从JVM路径(JDK bin路径)加载DLL
如果要加载带有路径的显式文件,请使用()
另请参见:如果您使用64位JRE加载32位版本的dll,则可能会出现此问题。这是我的案子
点击“代码> Visual C++ +可重新分配,用于vs2012
下载它并根据您的系统配置运行VSU_4\vcredit_x64.exe
或VSU_4\vcredit_x84.exe
将dll
文件与其他库(例如\lib\win32-x86\dll文件
)一起放入lib
文件夹中
我也有同样的问题,我尝试了这里发布的所有方法来解决它,但没有一个对我有效。
在我的例子中,我使用Cygwin来编译dll。JVM似乎试图在虚拟Cygwin路径中找到JRE DLL。
我将Cygwin的虚拟目录路径添加到JRE的DLL中,现在可以使用了。
我做了这样的事情:
SET PATH=“/cygdrive/c/Program Files/Java/jdk1.8.0_45”;%路径%
在我的情况下,我试图通过Eclipse中的连接器在Tomcat7中运行java web服务。当我将war文件部署到笔记本电脑上的Tomcat7实例时,应用程序运行良好。该应用程序需要用于“IBMDB29.5”的JDBCType2驱动程序。出于某种奇怪的原因,Eclispe中的连接器无法查看或使用ibmdb2环境变量中的路径来访问作为jcc客户端安装在我笔记本电脑上的dll文件。错误消息表示找不到db2jcct2 dll文件,或者找不到该dll文件的依赖库。最后,我删除了连接器并重建了它。然后它正常工作了。我将这个解决方案添加到这里作为文档,因为我在其他地方找不到这个特定的解决方案
- 简短回答:对于“找不到依赖库”错误,请检查$PATH(c
System.loadLibrary("myLibrary");
ReLinker.loadLibrary(context, "mylibrary");
System.loadLibrary("ffmpegCamera");