加载JNI .DLL,GCC编译工作,G ++编译失败

时间:2013-12-10 02:16:45

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

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

如果我使用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 ++命名函数的方式有所不同,但我不知道是什么......

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

感谢Greatwolf的提示:

事实证明我有另一个共享库libgcc_s_dw2-1.dll的引用。我在我的G ++编译中添加了“-static”标志,参考文献就消失了。现在它可以从Java加载!

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