cocos2d-x 3.4版本 Android ndk-gdb真机调试环境搭建

这段时间把cocos2d-x 3.4的一个测试工程编译到Android手机上时,总出现在C++层一些莫名的错误,所以想调试一下到底是哪里出了错,用的工具是Eclipse+ADT+CDT,最后也没弄成功,就把问题贴在这:http://www.cocoachina.com/bbs/read.php?tid=294829&page=e&#a,如果有朋友用Eclipse调试成功的,请分享一下。

没成功,就只能找其他方法了,终于在StackFlow上找到相关的信息:http://stackoverflow.com/questions/24334080/how-to-debug-cocos2d-x-3-native-code-on-android-device,而且信息已经比较健全了,在贴的最后提问者Narek把自己的总结也贴出来了。提问这位仁兄也是蛮不容易,用超过20天来解决这个问题,可见cocos2d-x提供的技术文档也是不够完善的,我也得好好感谢里面的两位NarekVikas Patidar。好吧,闲话到这,我们来看看,用ndk-gdb工具怎么调试。


一、确保cocos编译环境没问题

1、这个cocos自身已经做得非常自动化,在cocos引擎文件夹下双击一个setup.py,设置好ANDROID_SDK_ROOT,NDK_ROOT,ANT_ROOT基本就可以建立好编译环境,当然别忘了setup是用python来运行的。还用不懂就到网上找或者看cocos目录下的README.md文件。

2、这里最好把NDK路径加入到环境变量的系统路径(即Path环境变量中)。因为本文会频繁用到ndk-build和ndk-gdb.py(和ndk-gdb同个东西,但是也有点点区别,下文会提及)命令,把ndk路径加入到系统路径中也是为了好调取这两个命令


二、修改Android工程文件

这些操作都在proj.android文件进行

1、Jni文件夹下Android.mk修改这不用说,把自己工程要编译的写上去。

2、确认自己Android调试机的系统版本,从而确认自己API代号,如Narek的贴中所说,调试机是Android 2.3.3,那么它的API代号就是android-10,我的机器是4.03,那么API就是android-15,这个代号可以从ADT的Andoird SDK Manager工具确认。得到这个值之后,修改一下project.properties文件,把里面的XX

target=android-XX
android.library.reference.1=../cocos2d/cocos/platform/android/java

修改成你的测试机的代号。修改这个还不够,还有一个地方就在AndroidManifest.xml中:

<uses-sdk android:minSdkVersion="9"/>
<uses-feature android:glEsVersion="0x00020000" />

minSdkVersion项也改成调试机代号,不然一会执行ndk-gdb.py就出现以下错误:

ERROR: The device does not support the application's targetted CPU ABIs!
       Device supports:  armeabi-v7a armeabi
       Package supports: Android NDK: WARNING: APP_PLATFORM android-15 is larger than android:minSdkVersion 9 in ./AndroidManifest.xml

这个项可以等你调试没啥问题了,把它设置回来。


三、编译和运行工程

1、打开Windows的cmd、或者Linux的shell,转到你工程目录

2、编译工程,我这采取Narek的命令行,如果不懂cocos命令行的,参考http://www.jb51.cc/article/p-uoueekra-bky.html

cocos compile -p android -m debug --ndk-mode debug

看有没有编译成功,到我写完文章,都没有出错过,所以有出错疑问,可以先检查一下cocos的环境设置,再留到评论里探讨探讨

3、把工程运行到调试机上,也是Narek的命令行

cocos run -p android -m debug


四、开始调试

1、打开Windows的cmd、或者Linux的shell,转到你工程目录的proj.android

2、执行ndk-gdb.py命令(如果提示命令不存在,那就是你NDK在系统路径(path)中没设好,请自行检查)

NOTE:Narek用的是ndk-gdb命令,但是我后来(之前我一直也是用ndk-gdb)发现如果用ndk-gdb进入调试,会出现下方的错误:

warning: unrecognized item "timeout" in "qSupported" response
Ignoring packet error,continuing...
Ignoring packet error,continuing...

查询了一下,说得用 ndk-gdb.py 就没问题。


当然如果所用环境都搭建好了,不会出错。但是这里ndk-gdb.py还有很多命令参数,会导致启动失败,所以我也就介绍自己由于命令参数没设好导致的失败。

首先是--adb参数,这个参数是指定adb命令的路径。因为真机调试需要用adb命令来连接手机,所以这个参数是必须的。如果你在系统路径中已经指定了他的路径,那这里不加入这个参数也可以。但如果出现以下错误,你就必须去指定你的adb位置或修改你的路径

ERROR: The 'adb' tool is not in your path.
       You can change your PATH variable,or use
       --adb=<executable> to point to a valid one.

这个命令的路径一般是Android的sdk目录中的platform-tools下,我这边的指定如下(windows环境下):

ndk-gdb.py --adb=E:\Android\sdk\platform-tools\adb.exe

这个命令很常见,很多应用都有它的存在,就是要用它来连接手机,获取一些信息。


第二命令是--nowait参数。因为缺少jdb调试命令,出现的错误为:

ERROR: Failed to find jdb.
..you can use --nowait to disable jdb
..but may miss early breakpoints.

我们这里只要调试C++代码就可以,所以不用jdb,直接加上这个参数就可以了。不过有jdb的话,会有更多的信息。


第三个命令是--force。有时候我们可能有两个调试窗口调试应用,但是调试值允许一个窗口操作,另外一个窗口就调试不了,那此时这个命令就器作用,强制结束另外一个窗口的调试,直接用当前窗口调试。反正这个命令就是强制结束相同应用的进程。出错信息为:

ERROR: Another debug session running,Use --force to kill it.

第四个命令是可选的,--verbose,可以打印你工程的信息,调试信息,是非常有用的(之前说它没用,真亏待了它)。

第五个命令就是--launch。launch指定了应用入口的Activity,比如cocos2dx-3.4版本入口Activity是org.cocos2dx.cpp.AppActivity(我之前写错了,不是指定包的名字,sorry)

第六个命令把我害得最苦的,--start。先说说它的用法:这个命令是直接启动应用的命令,它自动帮你指定了入口的Activity。如果不在其目录下,启动不了。一般用这个命令就可以启动程序了,但是,我发现在cocos用着命令会发现一个奇怪的问题,必须指定入口Activity而且这个问题非常隐蔽,我也是用--verbose才看出问题(所以才说它有用)。我用这个命令一直出现以下的错误:

ERROR: Could not extract PID of application on device/emulator.
       Are you sure the application is already started?
       Consider using --start or --launch=<name> if not.
结果我用--verbose,看到了以下信息
Android NDK installation path: E:/Android/android-ndk-r10d
Using specific adb command: E:\Android\sdk\platform-tools\adb.exe
ADB version found: Android Debug Bridge version 1.0.32
Using ADB flags:
Using auto-detected project path: .
Found package name: com.cocos.test
ABIs targetted by application: armeabi
Device API Level: 15
Device CPU ABIs: armeabi-v7a armeabi
Compatible device ABI: armeabi
Using gdb setup init: ./libs/armeabi/gdb.setup
Using toolchain prefix: E:/Android/android-ndk-r10d/toolchains/arm-linux-androideabi-4.8/prebuilt/windows/bin/arm-linux-
androideabi-
Using app out directory: ./obj/local/armeabi
Found debuggable flag: true
Found device gdbserver: /data/data/com.cocos.test/lib/gdbserver
Found data directory: '/data/data/com.cocos.test'
Found first launchable activity: .org.cocos2dx.cpp.AppActivity
Launching activity: com.cocos.test/.org.cocos2dx.cpp.AppActivity
## COMMAND: adb_cmd shell am start -D -n com.cocos.test/.org.cocos2dx.cpp.AppActivity
## COMMAND: adb_cmd shell sleep 2.000000
Found running PID: 0

 这。。。。,入口函数里面多了个点(Found first launchable activity: .org.cocos2dx.cpp.AppActivity)。我想爆粗口:@#¥%#。我不知道怎么解释这个问题。。,所以我在这必须指定入口Activity了 
   
 

其他的命令我也没一一去研究,毕竟可以达到调试目的就可以了。

最终我的命令就是(懒人可以复制修改)

ndk-gdb.py --adb=adb路径\adb.exe --force --nowait --verbose --launch=org.cocos2dx.cpp.AppActivity
 
 

NOTE:这里一个错误(我没遇到过)要提一提。回到Narek的文章中,Narek执行了ndk-gdb后出现这样子的错误:

Nareks-MacBook-Pro:jni Narek$ ndk-gdb
jni/Android.mk:67: *** Android NDK: Aborting.    .  Stop.
ERROR: The device does not support the application's targetted CPU ABIs!
       Device supports:  armeabi-v7a armeabi
       Package supports: Android NDK: 

自己觉得这个有点像第二大点中没设置好工程文件的的API代号,这我也不敢断定,既然作者说了,那也写出来,好给有问题的人一点提示。但自己做了一些测过,但大部分资料来自他的原文。

如果你在jni文件夹中执行(这个命令应该是显示你编译的平台):

ndk-build DUMP_APP_ABI

正常的话应该是出现你编译的平台名字,如

armeabi

但Narek就出现如下的错误

Nareks-MacBook-Pro:jni Narek$ ndk-build DUMP_APP_ABI
Android NDK: /Users/Narek/NoorGames/Games/test2/proj.android/jni/Android.mk: Cannot find module with tag '.' in import path
Android NDK: Are you sure your NDK_MODULE_PATH variable is properly defined ?
Android NDK: The following directories were searched:
Android NDK: /Users/Narek/NoorGames/Games/test2/proj.android/jni/Android.mk:67: *** Android NDK: Aborting. . Stop.

由于Vikas Patidar建议Narek用ndk-build DUMP_APP_ABI打印平台信息,从而查出NDK_MODULE_PATH没有设定,所以V就成N的救星。

那么NDK_MODULE_PATH是在哪里?如果执行第三大步的第2小步命令,当命令执行不久,就可以看到NDK_MODULE_PATH的设置了

Runing command: compile
Building mode: debug
building native
NDK build mode: NDK_DEBUG=1
The Selected NDK toolchain version was 4.8 !
running: '/Users/Narek/NoorGames/android-ndk-r9d/ndk-build -C /Users/Narek/NoorGames/Games/test2/proj.android -j1 <strong>NDK_MODULE_PATH</strong>=/Users/Narek/NoorGames/Games/test2/proj.android/../cocos2d:/Users/Narek/NoorGames/Games/test2/proj.android/../cocos2d/cocos:/Users/Narek/NoorGames/Games/test2/proj.android/../cocos2d/external'

如果屏幕滚得太快,可以用键盘的pause(break)键来暂停,Enter可以继续

这个变量可以以环境变量添加到编译选项里,也可以直接添加到jni的Android.mk文件中,Narek把加到mk文件样板给贴出来了:

NDK_MODULE_PATH := $(LOCAL_PATH)/../../../../cocos
NDK_MODULE_PATH += $(LOCAL_PATH)/../../../../external

当然这也仅供参考,具体还得看你自己的工程的NDK_MODULE_PATH是怎样的。

3、开始GDB

只要出现(gdb)字样,那么接下去的事就是看你gdb基础扎不扎实


五、注意和提醒

1、在这里提醒一下,Narek文中叫我们要注意两个文件夹是否存在这些文件:

proj.android/libs/armeabi文件夹下:gdb.setup,gdbserver,libcocos2dcpp.so

proj.android/obj/local/armeabi(作者的路径是proj.android/jni/obj/local/armeabi,我的是这个):app_process,gdb.setup,libc.so,linker

第一个文件夹下的文件是在第三点第2步自动生成的,只要用了debug模式

第二个文件夹好像是执行了ndk-gdb.py后自动生成的

反正我这边这些文件都是自动生成的,但既然作者说了,大家也就检查一下。

2、这个方法应该都可以使用到cocos2d-x3.x的版本。


调试教程应该差不多,如果哪里写错,请不吝赐教,同时顺便帮忙解决这两个问题

1、程序一开始就崩溃,有没有更好的调试方法(这个问题自己解决了,只要通过本文,应该可以直接用命令行启动程序,直接到程序的入口)

2、有关于eclipse的调试方法吗?毕竟有界面的调试总比gdb调试直观多了


花了不少时间写这个东西,着实不容易,转载就请留个Mark吧:http://www.jb51.cc/article/p-zklcazmh-baa.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建
2019独角兽企业重金招聘Python工程师标准>>>cocos2d2.0之后加入了一种九宫格的实现,主要作用是用来拉伸图片,这样的好处在于保留图片四个角不变形的同时,对图片中间部分进行拉伸,来满足一些控件的自适应(PS: 比如包括按钮,对话框,最直观的形象就是ios里的短信气泡了),这就要求图
原文链接:http://www.cnblogs.com/linji/p/3599478.html1.环境和工具准备Win7VS2010/2012,至于2008v2版本之后似乎就不支持了。 2.安装pythonv.2.0版本之前是用vs模板创建工程的,到vs2.2之后就改用python创建了。到python官网下载版本2.7.5的,然后
环境:ubuntu14.04adt-bundle-linux-x86_64android-ndk-r9d-linux-x86_64cocos2d-x-3.0正式版apache-ant1.9.3python2.7(ubuntu自带)加入环境变量exportANDROID_SDK_ROOT=/home/yangming/adt-bundle-linux/sdkexportPATH=${PATH}:/$ANDROID_SDK_ROOTools/export
1开发背景游戏程序设计涉及了学科中的各个方面,鉴于目的在于学习与进步,本游戏《FlappyBird》采用了两个不同的开发方式来开发本款游戏,一类直接采用win32底层API来实现,另一类采用当前火热的cocos2d-x游戏引擎来开发本游戏。2需求分析2.1数据分析本项目要开发的是一款游
原文链接:http://www.cnblogs.com/linji/p/3599912.html//纯色色块控件(锚点默认左下角)CCLayerColor*ccc=CCLayerColor::create(ccc4(255,0,0,128),200,100);//渐变色块控件CCLayerGradient*ccc=CCLayerGradient::create(ccc4(255,0,0,
原文链接:http://www.cnblogs.com/linji/p/3599488.html//载入一张图片CCSprite*leftDoor=CCSprite::create("loading/door.png");leftDoor->setAnchorPoint(ccp(1,0.5));//设置锚点为右边中心点leftDoor->setPosition(ccp(240,160));/
为了答谢广大学员对智捷课堂以及关老师的支持,现购买51CTO学院关老师的Cocos2d-x课程之一可以送智捷课堂编写图书一本(专题可以送3本)。一、Cocos2d-x课程列表:1、Cocos2d-x入门与提高视频教程__Part22、Cocos2d-x数据持久化与网络通信__Part33、Cocos2d-x架构设计与性能优化内存优
Spawn让多个action同时执行。Spawn有多种不同的create方法,最终都调用了createWithTwoActions(FiniteTimeAction*action1,FiniteTimeAction*action2)方法。createWithTwoActions调用initWithTwoActions方法:对两个action变量初始化:_one=action1;_two=action2;如果两个a
需要环境:php,luajit.昨天在cygwin上安装php和luajit环境,这真特么是一个坑。建议不要用虚拟环境安装打包环境,否则可能会出现各种莫名问题。折腾了一下午,最终将环境转向linux。其中,luajit的安装脚本已经在quick-cocos2d-x-develop/bin/中,直接luajit_install.sh即可。我的lin
v3.0相对v2.2来说,最引人注意的。应该是对触摸层级的优化。和lambda回调函数的引入(嗯嗯,不枉我改了那么多类名。话说,每次cocos2dx大更新。总要改掉一堆类名函数名)。这些特性应该有不少人研究了,所以今天说点跟图片有关的东西。v3.0在载入图片方面也有了非常大改变,仅仅只是