Java 如何修复JNI项目中不满意的链接错误(无法找到依赖库)

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

我正在从事一个使用JNI的Java项目。JNI调用我自己编写的自定义库,比如mylib.dll,它依赖于第三方库libsndfile-1.dll

当我运行我的程序时,它会崩溃

java.lang.UnsatisfiedLinkError:  C:\...path...\mylib.dll: Can't find dependent libraries.
我搜索了这个网站(和其他网站),并尝试了一些修复:

  • 我跑了。DW给出了几个警告——libsndfile所需的两个库MPR.DLL和SHLWAPI.DLL存在“未解析的导入”——但DW表示可以安全地忽略这些警告

  • 我按照建议修复了mylib.dll中的方法名。方法名不知怎么被编译器弄乱了,但我添加了链接器标志,dll方法名现在与jni头文件中的名称完全匹配

  • 我将所有这些DLL放在同一个目录中--与调用它们的.jar的目录相同--以确保它们位于正确的路径上

  • 没有骰子

    有人知道发生了什么事吗


    我在VisualStudio2010的MacBookPro上进行开发(通过Parallels)。我正在东芝笔记本电脑上用Windows XP进行测试。

    我很确定类路径和共享库搜索路径之间没有什么关系。根据(当然是旧的),在Windows上,如果不使用
    java.library.path
    系统属性,则DLL需要位于当前工作目录或Windows
    path
    环境变量中列出的目录中


    更新:

    看起来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");