我有一个Java应用程序使用C文件通过JNI依赖于C库(FFMPEG)。我编译了这些C库的两个版本,并通过使用Dependency Walker检查输出确实是32位和64位。 使用Eclipse 64位,64位JRE构建和运行64位应用程序,使用Mingw64编译我的JNI C类没有问题。我试图在32位Eclipse上使用32位JRE并在System.loadLibrary()上遇到一些问题。
ERROR: java.lang.UnsatisfiedLinkError: C:\Dev\wks\HelloFfmpeg\VideoProcessor\bin\helloffmpeg.dll: Can't find dependent libraries
以下是我所做的检查
Dependency Walker告诉我:
现在有两件事我不太确定:
当我构建32位版本时,我在Eclipse CDT输出中得到它,其余的看起来很好
Info: Configuration "Default" uses tool-chain "MinGW GCC" that is unsupported on this system, attempting to build anyway.
在Dependency Walker中,发现一些系统DLL是64位版本 我不确定这些似乎是系统库,其中一个是MinGW库。如果我分发我的32位应用程序,我是否需要包含一些MinGW dll?这看起来不对。 在底部的四个错误中,那些不会出现在64位版本中的错误是这两个错误
Error: At least one module has an unresolved import due to a missing export function in an implicitly dependent module.
Error: Modules with different CPU types were found.
我理解第二个,但我不确定第一个。
更新
我按照下面的建议使用32位依赖性walker打开了32位DLL,并确保我的PATH现在指向mingw32 / bin而不是mingw64 / bin。结果更清晰,可以找到正确的LIBWINPTHREAD-1版本:
使用DWW时没有其他错误。然而,当我开始我的程序时,我仍然得到
ERROR: java.lang.UnsatisfiedLinkError: [blabla].dll: Can't find dependent libraries
有没有办法检查JNI加载器失败的依赖库?
UPDATE2
我在update1中解决了这个问题,我的eclipse启动配置中也有一个PATH覆盖... 我现在可以成功启动程序并加载JNI库及其依赖项。但是我仍然遇到32位库的一个问题,在尝试调用第一个JNI方法时,我得到一个UnsatisfiedLinkError,说它不存在。我在DWW中注意到方法名称后面有@ 8或@ 16,我认为这是导致问题,因为64位DLL没有这个
32位DLL:
64位DLL:
更新3
使用kool在this thread上的答案解决了32位方法结束时的@符号。