我目前正在努力使用Eclipse CDT和MinGW编译用于JNI的Dll。
在教程之后,我创建了一个声明本机方法的Java类,然后使用javah获取相关的头文件,并在C ++类中实现它。
C ++代码非常简单,编译工作正常,但是当我将库加载到Java类时,我收到此错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Main.integerMethod(I)I
at Main.integerMethod(Native Method)
at Main.main(Main.java:12)
我“探索了”dll并发现应该调用的方法都有一个像“@ 14”这样的后缀。问题是,我已经在使用-Wl, - kill-at编译器选项,它应该删除这些非常令人尴尬的标签......那么为什么它不起作用呢?
编译日志如下:
**** Rebuild of configuration DLL for project JniCTest ****
**** Internal Builder is used for build ****
g++ -IC:\Program Files\Java\jdk1.6.0_13\include -IC:\Program Files\Java\jdk1.6.0_13\include\win32 -O3 -Wall -c -fmessage-length=0 -mno-cygwin -D__int64=long long -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -oMain.o ..\Main.cpp
g++ -o libJniCTest.dll -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -shared -olibJniCTest.dll Main.o
Build complete for project JniCTest
Time consumed: 375 ms.
编译器选项有什么问题吗?谢谢你的帮助。
答案 0 :(得分:3)
找到解决方案。 --kill-at选项没有放在正确的命令中。实际上MinGW首先将文件编译成.o目标文件,然后(第二行)它从该.o文件进行链接。因此,该选项必须放在第二行。
更正了源文件Main.cpp和输出DLL libJniCTest.dll的命令:
g++ -I"C:\Program Files\Java\jdk1.6.0_13\include" -I"C:\Program Files\Java\jdk1.6.0_13\include\win32" -O0 -Wall -c -oMain.o ..\Main.cpp
g++ -Wl,--kill-at -shared -olibJniCTest.dll Main.o
答案 1 :(得分:0)
另外,不要忘记像这样包装你的实现
extern "C" {
//implemented methods
}
花了我几个小时才弄清楚
答案 2 :(得分:0)
我跟着这个简单 IBM网站上的JNI tutorial 并在 Windows XP 上使用以下命令编译给定的Sample1.c文件。它对我来说很好。
gcc -Wall -Wl,--kill-at -shared Sample1.c -o Sample1.dll -I"C:\Program Files\Java\jdk1.7.0\include" -I"C:\Program Files\Java\jdk1.7.0\include\win32"
P.S:根据您的系统更改JDK路径。