调试集成 Java 和 C/C++ 的代码
2010-01-25 00:00:00 来源:WEB开发网GCC 编译
标准 Java 分发版不带 GCC 库,所以编译有些复杂。对于上面的示例,通过下面的命令序列,我使用了 MinGW 工具箱:
基于 def 文件,生成 GCC 的库文件。用以下内容创建一个名为 jvm.def 的文件。 EXPORTS
JNI_CreateJavaVM@12
如果在 libjvm 文件中运行比如 dumpbin 或者 nm 这样的工具,则可以为其它的“调用 API”抽取引用。
创建一个应用程序可以链接的库文件。
dlltool -k --input-def jvm.def --dll jvm.dll --output-lib libjvm.a
编译 C 应用程序。
gcc -Ic:\_jdk\include -g -c main.c
将主应用程序与 JVM 链接在一起。
gcc -o main.exe main.o -L./ -ljvm
一些关键性 JNI 技巧
以下是使用 JNI 的一些技巧,可以用来避免一些常见问题:
始终检查 JNI 调用的返回值和异常。
在检查异常时,记住如果调用了 ExceptionDescribe() ,那么可能得到的描述过的异常是一段时间以前发生的,而不是最后一次调用的结果。
记住在任何线程终止前调用 threadDetach() 。如果执行调用失败,在垃圾收集器运行时,可能导致大问题。它将试图查找已经不存在的线程的堆栈帧。
和 JPDA 一起运行时,始终使用 java.compiler=NONE 。如果使用 java.compiler=fred ,那么 JNI 将停止 JIT,但实际上它没有起作用。
如需了解更多内幕,建议参考 Sheng Liang 所著的 The Java Native Interface和 Sun 的 JNI 站点。如果想要阅读 Essential JNI一书(其中关于 JNI 基础的章节写得很好),请注意其 Java 2 函数是基于 JDK beta 版的,因此它们没有那样的形式。
切记,在享用强大的,但不是纯 Java 语言的应用程序的好处时,不要忘记如何使用 JNI 来实现一个完整、复杂的调试过程。
更多精彩
赞助商链接