我有一个简单的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 ++命名函数的方式有所不同,但我不知道是什么......
答案 0 :(得分:1)
编译为C ++时,所有JNI导出的函数都需要extern "C"
。
答案 1 :(得分:1)
感谢Greatwolf的提示:
事实证明我有另一个共享库libgcc_s_dw2-1.dll的引用。我在我的G ++编译中添加了“-static”标志,参考文献就消失了。现在它可以从Java加载!
以防其他任何人与JNI地狱摔跤;我真的应该更仔细地研究Java异常,因为它实际上提到了这个问题(“找不到依赖库”)。我原以为这意味着它无法找到/读取我的库,但这实际上是指另一个.DLL依赖。