【问题标题】:Loading JNI .DLL, GCC compiled works, G++ compiled fails加载 JNI .DLL,GCC 编译成功,G++ 编译失败
【发布时间】:2013-12-10 02:16:44
【问题描述】:

我有一个简单的 JNI .DLL,我试图在测试 Java 应用程序中使用它。它是一个.c 文件,由几个函数组成,标题由javah 生成。 (顺便说一句,我正在使用 MinGW 编译)

如果我用 GCC 编译和链接这段代码,我可以用 System.loadLibrary() 加载 .DLL 并使用它。但是,如果我用 G++ 编译它,loadLibrary() 将因可怕的“UnsatisfiedLinkError”而失败。

这是我的 GCC 行:

gcc -Wl,--add-stdcall-alias -I"C:\Program Files (x86)\Java\jdk1.7.0_45\include" -I"C:\Program Files (x86)\Java\jdk1 .7.0_45\include\win32" -shared -o TestJNI.dll TestJNI.c

这是我的 G++ 行:

g++ -Wl,--add-stdcall-alias -I"C:\Program Files (x86)\Java\jdk1.7.0_45\include" -I"C:\Program Files (x86)\Java\jdk1 .7.0_45\include\win32" -shared -o TestJNI.dll TestJNI.c

有什么想法吗?我假设 G++ 命名函数的方式有所不同,但我不知道是什么......

【问题讨论】:

  • 你能检查一下dll中导出的函数名,看看两者有什么区别吗?您可以使用 depwalker 或 objdump 或 dumpbin 等来做到这一点。
  • 谢谢大狼!我下载了 depwalker,它立即告诉我我缺少一个引用的 .DLL (libgcc_s_dw2-1.dll)。这就是我需要知道的!

标签: gcc java-native-interface g++ mingw


【解决方案1】:

编译为 C++ 时,所有 JNI 导出函数都需要 extern "C"

【讨论】:

  • 我假设您指的是在函数实现(.C 文件)中添加 extern "C"?我原以为这也是问题,但添加它似乎对我的问题没有影响。
【解决方案2】:

感谢 Greatwolf 的提示:

原来我引用了另一个共享库 libgcc_s_dw2-1.dll。我在我的 G++ 编译中添加了“-static”标志,并且引用消失了。现在它可以从 Java 中正常加载!

以防万一其他人与 JNI 地狱搏斗;我真的应该更仔细地查看 Java 异常,因为它实际上提到了这个问题(“找不到依赖库”)。我以为这意味着它无法找到/读取我的库,但这实际上是指另一个 .DLL 依赖项。

【讨论】:

  • 请注意,您也可以使用-static-libgcc 强制它链接到静态版本。此外,如果您的库使用标准库的 C++ 代码,您还可以使用 -static-libstdc++ 强制静态链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
相关资源
最近更新 更多