调试集成 Java 和 C/C++ 的代码
2010-01-25 00:00:00 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁惧墽鎳撻—鍐偓锝庝簻椤掋垺銇勯幇顖毿撻柟渚垮妼椤粓宕卞Δ鈧獮濠勭磽閸屾艾鈧懓顫濋妸鈺佺疅缂佸顑欓崥瀣煕椤愵偅绶氱紓鍐╂礋濮婂宕掑▎鎴М濠电姭鍋撻梺顒€绉甸幆鐐哄箹濞n剙濡肩紒鎰殜閺屸€愁吋鎼粹€茬敖婵炴垶鎸哥粔鐢稿Φ閸曨垰鍐€妞ゆ劦婢€濞岊亪姊虹紒妯诲蔼闁稿海鏁诲濠氭晲婢跺﹤宓嗛梺缁樺姈缁佹挳宕戦幘璇叉嵍妞ゆ挻绋戞禍鐐叏濡厧浜鹃悗姘炬嫹

对于这个方法,应用程序需要使用“调用 API(Invocation API)”,它允许您将 JVM 装入到任意本机应用程序中。实际上,所有 Java 程序都使用“调用 API”启动。 java.exe 的启动程序使用“调用 API”来启动 VM,然后运行 main 类,尽管这样做会产生许多命令处理以及设置的开销。关键问题是从您的角度来看,Java 程序是如何启动的。
调用 JNI 方法样本代码
我已经准备了一些样本代码来演示调用 JNI 方法。
下载包含了以下五个文件:
jvm.def
libjvm.a
main.c
main.exe
main.o
这个代码示例使用与标准样本相同的类。 main.c 是编译到可执行文件中的 C 代码。它首先执行的是创建带调试选项的 JVM。(始终记住要正确设置选项的个数。)
goTest() 方法调用进入到 Java 类的 static 方法中。(设置为 static 使 JNI 代码更简单。)紧接在 goTest() 方法的前面,有一个无限循环。这个循环用在这里是出于调试方面的原因,我将在后面进行说明。
调试标准程序
现在让我们开始调试。设想需要启动 Java 程序,然后将 C 调试器与那个 Java 程序进程连接。有可能使用一些调试器,(比如 Visual C++)来直接运行 Java 可执行文件。使用这种方法,需要将您的 DLL 添加到附加的 DLL 列表中;否则,运行应用程序时,将无法设置断点。
Java 应用程序有一个可以动态装入 DLL 的 System.loadLibrary 调用。(注:本例演示了如何同时使用 JDB 和 GDB 进行调试。如果不希望使用 JDB,可以将 Java 设置为发生 System.loadLibrary 后停止等待用户的输入。)按照如下步骤进行操作:
在调试模式下运行 Java 程序。
更多精彩
赞助商链接