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

标签 java-native-interface mingw eclipse-cdt

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

相关文章:

android - 超时后CPP调用函数

java - IntelliJ Idea 和 JNI : Making Sure DLL's Are Where They Need to be for Execution

c++ - 与 MinGW 4.7.1 上的 -static-libstdc++ 标志链接

c++ - 如何将 eclipse 项目传输到新计算机?

java - 如何以编程方式检查是否启动了 Eclipse 控制台构建或 GUI 构建?

c++ - 如何在 Eclipse CDT 中使用 google test 管理测试输出?

java - C++ 中的 JNI Java

java - DLL 中函数的名称是什么?

c++ - 交叉编译linux-->windows : Getting newer OpenGL support with opengl32. dll

c - MinGW 和 MSVC 之间的链接困境(未定义引用)。 MinGW 失败 MSVC 工作