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

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代码:


更多相关文章

  1. Android(安卓)version and Linux Kernel version
  2. android 零星调试笔记
  3. Android(安卓)闹钟管理类的使用
  4. Android学习篇之Menu的使用
  5. android图表ichartjs
  6. Android(安卓)闹钟管理类的使用
  7. Android(安卓)Activity的启动
  8. android用户界面-组件Widget-画廊视图Gallery
  9. Ionic 运行报错No resource identifier found for attribute 'ap

随机推荐

  1. android应用程序的混淆打包(转)
  2. How to download sourcecode of android
  3. Cocos2dx 复制文本到剪切板(Android(安卓)
  4. Android(安卓)CircularFloatingActionMen
  5. Android(安卓)中文 API (17) —— TextSwit
  6. Android(安卓)启动过程
  7. Android去哪儿客服端(4)
  8. Android(安卓)studio导入新项目关于Gradl
  9. android 自定义ViewAnimator文字轮播广告
  10. Android(安卓)app安装路径 2