- 浏览: 427002 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
Glogo:
楼主您好,我在试验您的代码的时候发现新开的三个子线程并没有一直 ...
java 高并发 ReentrantLock -- 可重入的锁 -
univasity:
最近发觉也被限速了,投诉一下就好一会~~ 看来明天又要和电信M ...
ADSL上网速度慢 都是帐号限速惹的祸 -
liuyuanhui0301:
java 高并发 ReentrantLock -- 可重入的锁 -
dang_java:
呵.很好的说明文档.
JXTA技术与应用发展 -
helloqidi:
谢谢,学习了
SQL中exists和in的区别
Linux_Macintosh 平台下 Eclipse 环境中的 JNI 混合语言调试 |
级别: 初级 张 垚 (yaozhang@cn.ibm.com), 软件工程师, IBM 2008 年 4 月 17 日 在当今的应用程序开发尤其是大型程序开发中,混合语言的使用已经是相当普 遍了。在 Java 应用程序开发中,程序员可以很方便的使用 JNI(Java Native Interface) 来实现 C/C++ 和 Java 代码的相互调用。本文简要介绍了在 Linux/Macintosh 平台上针对 JNI 的混合语言调试环境的搭建以及调试方法,并通过一个调试实例来给读者提供一个比较直观的演示。<!----><!----><!---->
本文简要介绍了在 Linux/Macintosh 平台上针对 JNI 的混合语言调试环境的搭建以及调试方法,并通过一个调试实例来给读者提供一个比较直观的演示。 在 Linux/Macintosh 平台上, Eclipse JDT 是最好的 Java 开发集成环境之一。读者如果想了解更多 JDT 相关信息,可以去 http://www.eclipse.org/jdt/ 看一下,本文只会介绍和调试相关的内容。
本地调试一般适用于程序员的开发环境,并且调试内容不依赖与 UI 事件。本地调试的好处在于你可以完整的调试整个应用程序的生命周期,从一开始启动到程序退出。 远程调试则主要在两种情况下使用。1)被调试的 Java 程序所运行的机器上没有也无法安装 Eclipse, 比如客户机器上运行的产品。2)所调试的 Java 程序内容依赖于某些 UI 事件,比如焦点切换等等。远程调试必须在被调试的程序已经运行起来后,才能 attach 并进行调试,因此它无法完整的调试应用程序的整个生命周期。 在开始调试之前,你需要做一些配置工作。
图1 Open Perspective 的子菜单中的 Java 项
图2 Open Run Dialog 菜单项
图3 Java 应用程序选择调试类型 这里我们以 Java Application 为例。接下来你需要设置相关的程序启动参数。
图4 Debug 对话框的 Main 页面
图5 设置程序启动相关参数以及 JVM 参数
远程调试的设置则相对简单。
-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n 这里有两点需要说明一下 1)address=8000 中的 8000 指的是端口号,你也可以指定别的未使用的端口号,调试机器需要在 Eclipse 中配置相同的端口号才能成功连接。 2)请注意参数的逗号前后是没有空格的。
图6 Remote Java Application 调试类型
无论是本地调试还是远程调试,在进行调试后就可以通过点击菜单 Windows->Open Perspective->Debug 来切换到 Debug Perspective。 图7 Open Perspective 的 Debug 菜单项 Debug Perspective 中主要包括 Debug, Editor, Outline, Variable, Breakpoint 和 Console 视图。 图8 Debug Perspective
JNI 程序的纯 Java 代码部分的调试是和调试其他 Java 程序相同的,所不同的地方就是当调用到 native 方法的时候,再往里执行就会进入 C/C++ 代码,这时候就需要使用 gdb 来进行调试了,在下一节中会详细介绍。 在这里作者有几个在日常调试 Java 代码过程中总结的 Tips 和大家分享一下。
在 Eclipse 中显示的调用堆栈只包括 Java 的堆栈,C/C++ 的堆栈是看不见的。那么当你断在某个 native 方法的 C/C++ 实现中,却想要看到 Java 的调用堆栈,就可以通过在 Eclipse 中将断点设在 native 方法上,而不是某一代码行来达到目的。具体方法是在 Outline 视图或者 Editor 视图中选择欲设置断点的 native 方法,然后点击菜单 Run->Toggle Method Breakpoint 即可。当程序调用这个 native 方法是,会自动断在方法入口处。
在某些情况下,条件断点的使用可以极大的提高调试效率。在 Eclipse 中设置条件断点的方法是:在 Breakpoint 视图中选择某个断点,在右键菜单中选择 Breakpoint Properties…,这时会弹出断点属性对话框。 在属性对话框中勾上 Enable Condition 项,就可以在文本框中输入条件表达式了。同时你还可以选择是当条件表达式为真是中断还是条件表达式的值变化的时候中断,以及是中断当前线程还是 JVM 中的所有线程。 图9 条件断点设置
在某些情况下,需要在程序抛出异常的时候及时中断,来获取异常发生时的现场。这可以通过设置异常断点来实现。 点击菜单 Run->Add Java Exception Breakpoint…,会显示异常断点设置对话框。 图10 异常断点设置
图11 获取被调试程序(java)的进程 id
图12 用 gdb attach 到被调试的 java 进程
请注意,当你用 gdb attached 到 java 进程的时候, Eclipse 中的 Debug 视图会失去响应,此时你无法看到变量值或继续程序等等。直到你在 gdb 中使用 continue 命令继续程序执行时, Eclipse 中的 Debug 视图才会恢复响应。
这一节将给读者具体演示一个 JNI 的本地调试实例。例子的运行环境是 Mac OSX 10.5, 代码非常简单,共包含两个文件 testrun.java 和 testjni.c。 代码1 testrun.java
代码2 jnitest.c
jnitest.c 则包含了 com.ibm.jni.test.testrun.jniexample 的 C 实现。调试实例步骤如下:
图13 切换到 Debug Perspective 你可以查看当前的调用堆栈,线程,断点,变量值等等。
图14 获取 Java 进程 id
图15 Attach 到 java 进程并设置断点
图16 触发 gdb 断点
JNI 的混合语言调试是在编程过程中经常遇到的需求,在 Linux/Macintosh 平台上,Ecslipse 和 gdb 的混合使用功能强大而且使用方便。本文介绍了在 Linux/Macintosh 平台上针对 JNI 的混合语言调试环境的搭建以及调试方法,并结合一个具体实例演示了调试的基本过程,希望对读者有一点的帮助。 |
发表评论
-
Android 数字签名学习笔记
2012-04-25 11:03 965在 Android系统中,所有安装到系统的应用程序都必有 ... -
序列化:serializable,hessian,protobuf性能对比
2011-10-31 17:08 1248分布式应用系统中,系统之间的通讯的质量决定了系统的可用性 ... -
JAR 文件揭密
2011-10-18 01:28 887JAR 文件是什么? ... -
SSL双向认证java实现
2011-10-17 23:49 1018本文通过模拟场景,介绍SSL双向认证的java实现默认的情况下 ... -
Benchmark Analysis: Guice vs Spring
2011-04-19 14:35 1044The original link can be found ... -
Java Network Launching Protocol
2011-04-18 17:43 920在java开发的早期,重点被放在了客户端开发。语言中对于app ... -
NIO 包及工作原理
2011-03-11 11:14 1738NIO 包及工作原理 针对 ... -
使用Java NIO编写高性能的服务器
2011-03-11 01:19 796从JDK 1.4开始,Java的标 ... -
RMI, RMI-IIOP,JNDI
2009-05-21 17:31 15071. RMI-IIOP(Java Remote ... -
企业中的 RMI-IIOP
2009-05-21 17:13 1009RMI 和 CORBA 常被视 ... -
JMX
2009-05-21 15:44 982JMX规范 1.1 J ... -
使用Eclipse IDE的技巧
2009-02-24 11:00 1789使用Eclipse IDE的技巧 作 ... -
spring quartz 动态定时任务
2009-01-22 13:31 4487什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什 ... -
基于struts+spring+ibatis的轻量级
2009-01-12 16:21 1033基于struts+spring+ibatis的轻量级J2 ... -
Log4j配置实例[经典]
2009-01-12 14:53 1283Log4j配置实例[经典] 0 推荐 ... -
jbpm工作流学习心得
2008-09-19 13:59 1301一,装载流程: 第一种: java 代码 JbpmCo ... -
jbpm请假工作流
2008-09-19 13:56 1848请假流程(备用) 工作中要用到JBPM写工作流,自习的时 ... -
利用JExcel API操作EXCEL文件
2008-09-08 10:52 1470使用Windows操作系统的朋 ... -
jExcel API讲解
2008-09-08 10:51 1491转自:http://jhobby.iteye.com/blog ... -
Tomcat5.0乱码全解决方案
2008-09-02 11:56 1094http://hi.baidu.com/liet2008/bl ...
相关推荐
08_17_JNI_04_JNI引用&缓存策略08_17_JNI_04_JNI引用&缓存策略08_17_JNI_04_JNI引用&缓存策略08_17_JNI_04_JNI引用&缓存策略08_17_JNI_04_JNI引用&缓存策略08_17_JNI_04_JNI引用&缓存策略08_17_JNI_04_JNI引用&缓存...
08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08...
08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_...
通过以上步骤,你就能够在Linux环境下使用Eclipse和NDK进行原生代码的开发和调试了。这允许你充分利用C/C++的性能优势,同时借助Java的便利性来构建Android应用。在开发过程中,加入相关的QQ群与其他开发者交流,...
`serial_jni_largestgle_Androidjni_Android串口操作JNI代码_android_`这个项目就是关于如何使用JNI来实现Android设备的串口读写的示例。 首先,我们需要了解JNI的概念。JNI是Java平台提供的一种接口,允许Java代码...
标题"Eclipse_Jni_Opencv_NDK"涉及的是在Eclipse环境下使用JNI(Java Native Interface)集成OpenCV库,并通过NDK(Native Development Kit)进行原生代码开发。这是一个关于Android平台上的混合编程实践,旨在利用...
JNI(Java Native Interface)是Java平台的一个重要组成部分,它允许Java代码和其他语言写的代码进行交互。这个"JNI_API.rar"压缩包包含了一份关于Android JNI API的详细文档,以CHM(Compiled HTML Help)格式存在...
Java本地接口(JNI)是Java平台的标准组成部分,它允许Java代码和其他语言编写的代码进行...提供的PDF文档"Java_JNI_VC++_details.pdf"应该会进一步深入探讨这些概念,并可能包含实际示例和最佳实践,建议仔细阅读。
在Android开发中,JNI(Java Native Interface)是一个关键的技术,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都非常有用,比如优化性能、使用现有的C/C++库、或者像在这个“JniCallback.zip”文件...
标题中的"jni.rar_3GPP AMR jni_amr_ilbc_jni_jni amr"揭示了这个压缩包文件的核心内容,它涉及到Java平台下的JNI(Java Native Interface)技术,以及3GPP AMR(Adaptive Multi-Rate)音频编码格式和ILBC(Internet...
JNI(Java Native Interface)是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互。在本示例"JNI_Demo.rar"中,我们有一个演示如何使用JNI来调用C语言编写的动态链接库(DLL)的实例。这个DEMO是...
JNI(Java Native Interface)是Java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在Android开发中扮演着重要的角色,尤其是在涉及到性能优化、调用系统底层API或使用C/C++库时。本篇文章将通过分析...
本教程将详细介绍如何在C层利用JNI进行调试,并在Eclipse环境中输出信息。 首先,我们需要理解JNI的基本工作原理。JNI提供了一种方式让Java代码能够调用本地(Native)代码,也就是C/C++代码,同时本地代码也可以...
本文将指导读者如何在 Eclipse 中搭建 JNI 开发环境,并使用 CDT 插件进行 C/C++ 代码的编写和编译。 环境搭建 1. 安装 CDT 插件 CDT(C/C++ Development Tooling)是 Eclipse 中的 C/C++ 开发插件。可以从官方...
在这个“jni.zip”压缩包中,我们主要探讨的是如何使用C++通过JNI来调用Java类,这是Java平台跨语言交互的一个重要技术。下面将详细介绍这个过程: 1. **JNI基本结构**: JNI接口定义了一组函数,这些函数允许本地...
标签中的“animation_jni_mk”提到了动画和mk文件。在Android中,JNI的链接过程会涉及到一个名为"Android.mk"的文件,这是一个Makefile,用于指示编译系统如何构建本地代码。在这个过程中,"Android.mk"文件定义了...
例如,在Windows上,`JNIEnv`接口的实现可能与Linux或Mac OS有所不同,因此`jni_md.h`会包含这些平台特定的差异。 在提供的压缩包中,`www.pudn.com.txt`可能是下载来源的说明或链接,而`JNI_md`可能就是上述提及的...
标题中的"jni_demo.rar_DEMO_jni vc"表明这是一个关于JNI (Java Native Interface)的示例,使用Visual C++(VC++)进行编程。JNI是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。这个RAR压缩包...
08_10_C_06_预编译&jni开发流程08_10_C_06_预编译&jni开发流程08_10_C_06_预编译&jni开发流程08_10_C_06_预编译&jni开发流程08_10_C_06_预编译&jni开发流程08_10_C_06_预编译&jni开发流程08_10_C_06_预编译&jni开发...
Java本地接口(JNI,Java Native Interface)是Java平台标准的一部分,它允许Java代码与其他语言写的代码进行交互。JNI在很多场景下都非常有用,比如当需要调用已有的C/C++库,或者利用硬件特性,或者优化性能时。本...