MinGW的编译器选项Wl, - kill-at不起作用

时间:2011-01-31 11:39:42

标签: java-native-interface mingw eclipse-cdt

我目前正在努力使用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.  

编译器选项有什么问题吗?谢谢你的帮助。

3 个答案:

答案 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路径。

相关问题