Eclipse+CDT+GDB调试android NDK程序
2013-02-25 16:43
411 查看
http://www.cnblogs.com/shadox/archive/2011/12/02/2272564.html
Eclipse+CDT+gdb调试android ndk程序
先介绍一下开发环境,在这个环境下,up主保证是没有问题的。
ubuntu 11.10
eclipse 3.7(indego) for java
jdk 6
android sdk 2.2
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代码:
完毕。
分类: android 学习笔记
绿色通道: 好文要顶 关注我 收藏该文与我联系
自由泳的青蛙
关注 - 0
粉丝 - 8
+加关注
7
0
(请您对文章做出评价)
« 博主上一篇:第六章
休眠
» 博主下一篇:ios,设备标签与设备型号的对应关系
« 首页上一篇:玩转像素系列【一】
» 首页下一篇:maven环境快速搭建
posted @ 2011-12-02 18:43 自由泳的青蛙 阅读(18643) 评论(15) 编辑 收藏
评论列表
#1楼 2011-12-02
18:56 绝望生鱼片
很实用~!
支持(0)反对(0)
#2楼 2011-12-07
01:37 Lovell
引用于是就要给gcc添加一个环境变量让它来找到jni.h了,环境变量名称为C_INCLUDE_PATH。这个名字不能乱写,windows下类似的环境变量叫做INCLUDE。
然后多刷新几次工程,这些错误就消失了。
能具体说下如何设置吗?谢谢楼主了!
支持(0)反对(0)
#3楼[楼主] 2011-12-08
10:54 自由泳的青蛙
@Lovell
linux修改环境变量有很多的方法,可以上网搜索一下。我习惯于修改用户目录下的.bashrc文件。
着这个文件末尾加上
set C_INCLUDE_PATH=.:XXXXXXXXX()
export C_INCLUDE_PATH
然后重新登录一下,这个环境变量就会生效了。
支持(0)反对(0)
#4楼 2012-01-05
16:15 再生的雄鹰
然后启动C++的debug,即之前配置好的那个jni debug。
请问这个怎么启动呢?谢谢
支持(0)反对(0)
#5楼[楼主] 2012-01-07
10:18 自由泳的青蛙
@再生的雄鹰
debug 旁边不是有一个小箭头么....
支持(0)反对(0)
#6楼 2012-03-07
09:59 cxfancygg
楼主,请问下,这个
于是就要给gcc添加一个环境变量让它来找到jni.h了,环境变量名称为C_INCLUDE_PATH。这个名字不能乱写,windows下类似的环境变量叫做INCLUDE。
然后多刷新几次工程,这些错误就消失了。
在windows下cygwin下应该怎么改环境变量啊,能随便写个具体例子么,万分感谢
支持(0)反对(0)
#7楼 2012-03-09
14:27 苗永超
我照着这个帖子在ubuntu下面弄了大半天就基本弄好了我要的一切目的。
但是在windows下面我之前也是参照这个帖子,我足足弄了三天也没有搞定,我不由得感叹世界的神奇~
支持(0)反对(0)
#8楼[楼主] 2012-03-12
21:17 自由泳的青蛙
@苗永超
我这个本来就是对ubuntu环境下弄的。
windows下要借助cygwin, 而且效果很不流畅。
支持(0)反对(0)
#9楼 2012-03-16
15:41 syd3050
@自由泳的青蛙
Hi,不好意思打扰一下:)我在bashrc中这样设置了环境变量:
export C_INCLUDE_PATH=/home/Hanson/Eclipse/jdk1.6.0_31/include
但是那个hello-jni.c文件上还是显示jni.h无法识别,很多变量都是无法识别的,请问还需要怎么设置环境变量吗?谢谢楼主~~
支持(0)反对(0)
#10楼 2012-03-19
10:46 苗永超
@syd3050
朋友,你确定你的环境变量已经加入到系统中了吗?
echo $C_INCLUDE_PATH 看看
支持(0)反对(0)
#11楼 2012-03-19
15:52 syd3050
@苗永超
原来是Eclipse中还要设置一下对应的环境变量,已经搞定了,谢谢楼主的好文:)
支持(0)反对(0)
#12楼 2012-03-21
22:32 liuyix
虽然调试的部分设置很繁琐,但是用起来挺方便的
支持(0)反对(0)
#13楼 2012-05-22
15:14 zhuwei168
引用
syd3050:
@自由泳的青蛙
Hi,不好意思打扰一下:)我在bashrc中这样设置了环境变量:
export C_INCLUDE_PATH=/home/Hanson/Eclipse/jdk1.6.0_31/include
但是那个hello-jni.c文件上还是显示jni.h无法识别,很多变量都是无法识别的,请问还需要怎么设置环境变量吗?谢谢楼主~~
您好,楼主,我还是没明白这个环境变量如何设置,我在mac系统也是这一步过不去,现在在linux下也是这步不行。c代码一直报错。
支持(0)反对(0)
#14楼 2012-10-18
16:07 winfree
真机也可以用么?
支持(0)反对(0)
#15楼 2012-10-23
13:57 yuekaizong
ndk-R7以上的ndk-build.cmd,可以直接生成so文件,那么ndk的话应该不应该借助cygwin去调试C++,应该ndk里面直接有include,
楼主“于是就要给gcc添加一个环境变量让它来找到jni.h了,环境变量名称为C_INCLUDE_PATH。这个名字不能乱写,windows下类似的环境变量叫做INCLUDE。 ”应该还还有别的办法ba ?
支持(0)反对(0)
Eclipse+CDT+GDB调试android
NDK程序
Eclipse+CDT+gdb调试android ndk程序先介绍一下开发环境,在这个环境下,up主保证是没有问题的。
ubuntu 11.10
eclipse 3.7(indego) for java
jdk 6
android sdk 2.2
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代码:
完毕。
分类: android 学习笔记
绿色通道: 好文要顶 关注我 收藏该文与我联系
自由泳的青蛙
关注 - 0
粉丝 - 8
+加关注
7
0
(请您对文章做出评价)
« 博主上一篇:第六章
休眠
» 博主下一篇:ios,设备标签与设备型号的对应关系
« 首页上一篇:玩转像素系列【一】
» 首页下一篇:maven环境快速搭建
posted @ 2011-12-02 18:43 自由泳的青蛙 阅读(18643) 评论(15) 编辑 收藏
评论列表
#1楼 2011-12-02
18:56 绝望生鱼片
很实用~!
支持(0)反对(0)
#2楼 2011-12-07
01:37 Lovell
引用于是就要给gcc添加一个环境变量让它来找到jni.h了,环境变量名称为C_INCLUDE_PATH。这个名字不能乱写,windows下类似的环境变量叫做INCLUDE。
然后多刷新几次工程,这些错误就消失了。
能具体说下如何设置吗?谢谢楼主了!
支持(0)反对(0)
#3楼[楼主] 2011-12-08
10:54 自由泳的青蛙
@Lovell
linux修改环境变量有很多的方法,可以上网搜索一下。我习惯于修改用户目录下的.bashrc文件。
着这个文件末尾加上
set C_INCLUDE_PATH=.:XXXXXXXXX()
export C_INCLUDE_PATH
然后重新登录一下,这个环境变量就会生效了。
支持(0)反对(0)
#4楼 2012-01-05
16:15 再生的雄鹰
然后启动C++的debug,即之前配置好的那个jni debug。
请问这个怎么启动呢?谢谢
支持(0)反对(0)
#5楼[楼主] 2012-01-07
10:18 自由泳的青蛙
@再生的雄鹰
debug 旁边不是有一个小箭头么....
支持(0)反对(0)
#6楼 2012-03-07
09:59 cxfancygg
楼主,请问下,这个
于是就要给gcc添加一个环境变量让它来找到jni.h了,环境变量名称为C_INCLUDE_PATH。这个名字不能乱写,windows下类似的环境变量叫做INCLUDE。
然后多刷新几次工程,这些错误就消失了。
在windows下cygwin下应该怎么改环境变量啊,能随便写个具体例子么,万分感谢
支持(0)反对(0)
#7楼 2012-03-09
14:27 苗永超
我照着这个帖子在ubuntu下面弄了大半天就基本弄好了我要的一切目的。
但是在windows下面我之前也是参照这个帖子,我足足弄了三天也没有搞定,我不由得感叹世界的神奇~
支持(0)反对(0)
#8楼[楼主] 2012-03-12
21:17 自由泳的青蛙
@苗永超
我这个本来就是对ubuntu环境下弄的。
windows下要借助cygwin, 而且效果很不流畅。
支持(0)反对(0)
#9楼 2012-03-16
15:41 syd3050
@自由泳的青蛙
Hi,不好意思打扰一下:)我在bashrc中这样设置了环境变量:
export C_INCLUDE_PATH=/home/Hanson/Eclipse/jdk1.6.0_31/include
但是那个hello-jni.c文件上还是显示jni.h无法识别,很多变量都是无法识别的,请问还需要怎么设置环境变量吗?谢谢楼主~~
支持(0)反对(0)
#10楼 2012-03-19
10:46 苗永超
@syd3050
朋友,你确定你的环境变量已经加入到系统中了吗?
echo $C_INCLUDE_PATH 看看
支持(0)反对(0)
#11楼 2012-03-19
15:52 syd3050
@苗永超
原来是Eclipse中还要设置一下对应的环境变量,已经搞定了,谢谢楼主的好文:)
支持(0)反对(0)
#12楼 2012-03-21
22:32 liuyix
虽然调试的部分设置很繁琐,但是用起来挺方便的
支持(0)反对(0)
#13楼 2012-05-22
15:14 zhuwei168
引用
syd3050:
@自由泳的青蛙
Hi,不好意思打扰一下:)我在bashrc中这样设置了环境变量:
export C_INCLUDE_PATH=/home/Hanson/Eclipse/jdk1.6.0_31/include
但是那个hello-jni.c文件上还是显示jni.h无法识别,很多变量都是无法识别的,请问还需要怎么设置环境变量吗?谢谢楼主~~
您好,楼主,我还是没明白这个环境变量如何设置,我在mac系统也是这一步过不去,现在在linux下也是这步不行。c代码一直报错。
支持(0)反对(0)
#14楼 2012-10-18
16:07 winfree
真机也可以用么?
支持(0)反对(0)
#15楼 2012-10-23
13:57 yuekaizong
ndk-R7以上的ndk-build.cmd,可以直接生成so文件,那么ndk的话应该不应该借助cygwin去调试C++,应该ndk里面直接有include,
楼主“于是就要给gcc添加一个环境变量让它来找到jni.h了,环境变量名称为C_INCLUDE_PATH。这个名字不能乱写,windows下类似的环境变量叫做INCLUDE。 ”应该还还有别的办法ba ?
支持(0)反对(0)
相关文章推荐
- Eclipse+CDT+GDB调试android NDK程序
- Eclipse+CDT+gdb调试android ndk程序
- Eclipse+CDT+GDB调试android NDK程序
- Eclipse+CDT+GDB调试android NDK程序
- Eclipse+CDT+gdb调试android ndk程序
- Eclipse+CDT+GDB调试android NDK程序
- Eclipse+CDT+GDB调试android NDK程序
- Eclipse+CDT+gdb调试android ndk程序
- Eclipse+CDT+GDB 调试android NDK程序
- Eclipse+CDT+GDB调试android NDK程序
- Eclipse+CDT+GDB调试android NDK程序
- 【转】使用J-Link GDB Server + Eclipse CDT进行ARM程序调试
- Eclipse+CDT+GDB调试Android NDK程序
- Eclipse+CDT+GDB调试android NDK程序
- Eclipse+CDT+gdb调试android ndk程序
- Eclipse+CDT+GDB调试android NDK程序(转)
- Eclipse+CDT+GDB调试android NDK程序
- Eclipse+CDT+GDB调试android NDK程序
- Eclipse+CDT+GDB调试android NDK程序
- Eclispe+CDT+gdb调试android ndk程序----包括CDT组件跟Sequoyah Android Native Code Support组件安装