我目前正在努力使用 Eclipse CDT 和 MinGW 编译 Dll 以供 JNI 使用。
按照教程,我创建了一个声明 native 方法的 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.
编译器选项有问题吗?感谢您的帮助。
最佳答案
找到解决方案。 --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
关于java-native-interface - MinGW的编译器选项Wl,--kill-at不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4850439/