Eclipse+CDT+gdb调试android ndk程序

先介绍一下开发环境,在这个环境下,up主保证是没有问题的。

  1. ubuntu 11.10
  2. eclipse 3.7(indego) for java
  3. jdk 6
  4. android sdk 2.2
  5. andrid ndk r7

当然,在windows环境下通过cygwin等工具也是可以实现gdb调试的,我也确实实现过。但是性能实在太低,卡的根本没法用。Linux下直接用gdb调试本地方法是很流畅的。

再确定安装并配置好开发环境之后,就可以开始了。

首先得确定自己能够正常的运行一个ndk工程,连运行都成问题的话,也就谈不上什么调试了。

新建一个android项目,选择crete project form existing source,源代码位于

/home/shaodx/android/android-ndk-r7/samples/hello-jni,即ndk目录的samples/hello-jni。

Next>

Sdk target 就选2.2吧 ,其他的虽然没测试,应该也没什么问题。

Finsh

Hellojni项目极其简单,看代码就懂了。在activitie下建立一个textview,然后调用一个natvie方法来返回一个字符串,然后把textview的text设置为这个字符串。

为了方便看到调试后的效果和局部变量的变化情况,我加了几行对程序结果没影响的代码。

Java代码:

C++:

当然,这个时候直接运行的话,程序肯定会崩溃的。因为动态链接库还没编译好。Ndk根目录下的ndk-build负责编译so文件。首先进入项目所在目录,然后运行ndk-build即可。

效果如下:

出错了…..

Host 'awk' tool is outdated.

上网搜索之后的解决方案如下:

到/home/shaodx/android/android-ndk-r7/prebuilt/linux-x86/bin/目录下找到这个awk,file一下:

这个awk文件居然是64位版的,难怪之前说过期了。(google程序员粗心了吧)

解决方案居然是把这个awk删了就行了……………..

解决问题之后,换个姿势,再来一次

So文件存在于libs/armeabi/libhello-jni.so。

现在就可以运行程序了。

不过要是每一次修改c++代码都还要调用ndk-build的话,那也太麻烦了。介绍一个一劳永逸的方法。

首先,要给eclipse安装一个CDT,eclipse>help>install new software

下载地址为   http://download.eclipse.org/tools/cdt/releases/indigo/

反正我是把所有的选项都给安装了,也花不了太多的时间。

然后是安装sequoyah  地址为 http://download.eclipse.org/sequoyah/updates/2.0/

这个就只需要安装Sequoyah Android Native Code Support 一项就可以了。

然后把当前项目转换为C++项目。

File>new>other:

Convert to a c/c++ Project

依照图中所示设置:

Finish。

这个时候,项目中的c++代码也会被识别了。一般这个时候就会爆出一堆错误,主要是gcc找不到jni.h头文件,同样也识别不了来自jni的一些函数和数据类型:

于是就要给gcc添加一个环境变量让它来找到jni.h了,环境变量名称为C_INCLUDE_PATH。这个名字不能乱写,windows下类似的环境变量叫做INCLUDE。

然后多刷新几次工程,这些错误就消失了。

接下来,进行C++代码的编译配置。

进入工程属性页,build command设置为ndk下ndk-build的完整路径。

将Behavior选项页下的build处的all替换为空格

接下来就可以直接运行了,每次运行的时候,就会自动把C++代码编译成so文件。同时,可以在eclipse中编写java代码和C++代码,很是方便。

往下的工作就真的跟调试相关了。

首先进入工程目录,然后运行ndk目录下的ndk-gdb。执行这一步骤时,应当先确保有模拟器在运行。如果有人更习惯于命令式的方法来调试程序的话,就可以直接用这个ndk-gdb来调试程序了。接下来的步骤就是把这个gdb调试图形化。

在eclipse下进入debug>debug configuration,选择C/C++ Application,main选项卡下的C/C++ Application处填写为/home/shaodx/android/android-ndk-r7/samples/hello-jni/obj/local/armeabi/app_process,这个文件是专为调试而存在的,假如发现找不到这个文件的话,就应当先运行一次ndk-gdb。只运行ndk-build是不会产生这个文件的。Project选择当前的HelloJni。

最下面的 process launcher  select other 选择stuanard

然后进入Debugger选项卡,Stop on startup at 填写的是C++程序的入口函数,这个项目中就是Java_com_example_hellojni_HelloJni_stringFromJNI了,我觉得这个参数应该没什么用的,记得设置断点就行了。Gdb debugger 为:home/shaodx/android/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gdb,这个路径下有很多文件针对其他平台的,别选错了。Gdb command file为/home/shaodx/android/android-ndk-r7/samples/hello-jni/obj/local/armeabi/gdb2.setup,目前这个gdb2.setup文件还不存在,待会在创建。底下的Verbose console mode 一定要记得勾上,这样才能在eclipse控制台中用指令来与gdb交互。

进入debugger options的 connection子项,type为tcp,端口为5039:

设置完毕之后,apply。

接下来只需要修改两个文件即可。修改之前记得备份

首先是ndk-gdb,把最底下的一行 “$GDBCLIENT -x `native_path $GDBSETUP`”直接去掉,保存。

然后把'/home/shaodx/android/android-ndk-r7/samples/hello-jni/obj/local/armeabi'目录下的gdb.setup复制一份,命名为gdb2.setup。把gdb2.setup打开,去掉最后一行的“target remote :5039”,千万不要在以为把gdb.setup修改好,然后把之前的设置指向gdb.setup会起作用,因为每次调用ndk-gdb的时候,都会产生一个新的gdb.setup 来覆盖掉修改。

然后就可以给代码设置断点了,首先在调用本地方法之前记得有一个断点,之后也设置一个。

C++的代码在函数入口处设置一个断点即可。

下面开始正式的调试了,先运行项目的java调试。程序会再运行到第一个断点处停下来。

这个时候赶紧运行在命令行下进入工程目录,然后运行ndk根目录下的ndk-gdb。

运行之后是没有任何输出的。

然后启动C++的debug,即之前配置好的那个jni debug。

如图:

由于在C++程序之也设置了断点,继续摁F6就可以直接执行到C++程序中。

来个大图,熟悉eclipse的调试就没什么压力了。右上角可以直接看到局部变量的值,包括传进来的参数。

同时,可以在控制台直接与gdb通讯,要退出C++程序的调试的话,continue即可,程序又回到java代码:

转自:http://www.cnblogs.com/shadox/archive/2011/12/02/2272564.html

Eclipse+CDT+GDB调试android NDK程序(转)的更多相关文章

  1. 使用GDB调试Android NDK native(C/C++)程序

    使用GDB调试Android NDK native(C/C++)程序 先说明下,这里所谓的ndk native程序跟Android上层java应用没有什么关系,也不需要涉及jni来封装native接口 ...

  2. 使用GDB调试Android NDK native(C/C++)程序-转

    最 近写了些需要跨平台兼容的C++库,Android是其中需要兼容的平台之一.区别于Windows,Mac中功能强大的IDE环境,官方并没有为 Android ndk提供太多的支持.因此,尝试了下通过 ...

  3. mac上eclipse用gdb调试(转)

    mac上eclipse用gdb调试 With its new OS release, Apple has discontinued the use of GDB in OS X. Since 2005 ...

  4. gdb常用命令及使用gdb调试多进程多线程程序

    一.常用普通调试命令 1.简单介绍GDB 介绍: gdb是Linux环境下的代码调试⼯具.使⽤:需要在源代码⽣成的时候加上 -g 选项.开始使⽤: gdb binFile退出: ctrl + d 或 ...

  5. gdb常用命令及gdb调试多进程/线程程序&coredump

    一.常用普通调试命令 1.简单介绍GDB 介绍: gdb是Linux环境下的代码调试⼯具.使⽤:需要在源代码⽣成的时候加上 -g 选项.开始使⽤: gdb binFile退出: ctrl + d 或 ...

  6. 谈使用Eclipse与DDMS调试Android程序的方法

    在Eclipse开发工具中调试程序的方法很多,但是使用Eclipse调试Android程序时需要注意一些细节上的问题.许多刚接触 Android的开发者,在调试Android程序时总是不能迅速地找到程 ...

  7. 利用gdb 调试android jni c动态库

    http://blog.dornea.nu/2015/07/01/debugging-android-native-shared-libraries/ Since I haven't done thi ...

  8. 使用GDB调试Android Native 层代码

    --------------步骤:0. adb root0. adb shell0. ps | grep browser1. gdbserver :5039 --attach pid2. adb fo ...

  9. gdb调试带参数程序(转:笑笑小白,cnblog http://www.cnblogs.com/rosesmall/archive/2012/04/10/2440514.html)

    一般来说GDB主要调试的是C/C++的程序.要调试C/C++的程序,首先在编译时,我们必须要 把调试信息加到可执行文件中.使用编译 器(cc/gcc/g++)的 -g 参数可以做到这一点.如: > ...

随机推荐

  1. Leetcode: Unique Substrings in Wraparound String

    Consider the string s to be the infinite wraparound string of "abcdefghijklmnopqrstuvwxyz" ...

  2. maven更新远程仓库速度太慢解决方法

    1.maven在更新下载jar包的时候,因为jar包默认是从国外服务器上下载的,所以速度特别慢 2.通过设置镜像的方法加快jar包下载 3.在maven安装目录下,/config/settings.x ...

  3. Linux内核之旅 List_entry()

    #include "iostream" #define List_entry(type,member)\ (type *)(()->data)) ) using namesp ...

  4. delphi 功能函数大全-备份用

    function CheckTask(ExeFileName: string): Boolean;constPROCESS_TERMINATE=$0001;varContinueLoop: BOOL; ...

  5. Lua的元方法__newindex元方法

    上一篇介绍了__index元方法,总结来说:__index元方法是用于处理访问table中不存在的字段时的情况. 而今天,介绍的__newindex元方法,总结来说,就是:用于处理给table中不存在 ...

  6. oracle与sql server时间差的取法

    Oracle: oracle 两个时间相减默认的是天数 oracle 两个时间相减默认的是天数*24 为相差的小时数 oracle 两个时间相减默认的是天数*24*60 为相差的分钟数 oracle ...

  7. 《剑指Offer》面试题-从头到尾打印链表

    题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 输入: 每个输入文件仅包含一组测试样例.每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点.第一行是链表第一个节点的值,依次类推 ...

  8. 【转】异步编程 In .NET

    概述 在之前写的一篇关于async和await的前世今生的文章之后,大家似乎在async和await提高网站处理能力方面还有一些疑问,博客园本身也做了不少的尝试.今天我们再来回答一下这个问题,同时我们 ...

  9. docker 9 docker的容器命令

    有镜像才能创建容器,这是根本的前提 下面我们以下载一个centos镜像来做演示. [root@t-docker chenzx]# docker images REPOSITORY TAG IMAGE ...

  10. Java.ftp上传下载

    1:jar的maven的引用: 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...