在64位平台上为32位编译Eclipse JNI应用程序

时间:2016-07-14 11:10:38

标签: java eclipse java-native-interface shared-libraries 32bit-64bit

我有一个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

以下是我所做的检查

  • Eclipse是32位
  • 在这个Eclipse实例中,我只有1个JRE设置,32位,并且这是用于在我的运行配置中启动应用程序的设置
  • 在C / C ++构建中,我已将MINGW_HOME设置为指向具有32位gcc的Mingw32
  • 我已将所有必需的DLL(每个32位版本以及我用来运行64位版本的应用程序的每个人)复制到与BIN文件夹中的helloffmpeg.dll相同的文件夹中

Dependency Walker告诉我:

  • C:\ Dev \ wks \ HelloFfmpeg \ VideoProcessor \ bin \ helloffmpeg.dll是一个32位DLL
  • 我使用的32位ffmpeg DLL确实是32位,在加载helloffmpeg.dll时找到

现在有两件事我不太确定:

  • 当我构建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位版本 enter image description here 我不确定这些似乎是系统库,其中一个是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版本:

enter image description here

使用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:

enter image description here

64位DLL:

enter image description here

更新3

使用kool在this thread上的答案解决了32位方法结束时的@符号。

0 个答案:

没有答案