这是一个关于如何在安卓设备上调试cocos2d-x 3.x的逐步教程。如果您有更好的方法,请纠正或优化我的步骤。
cd proj.android
cocos compile -p android -m debug --ndk-mode NDK_DEBUG=1
(以带有调试信息的方式构建)
cocos run -p android -m debug
在设备上部署应用程序(有时会重新构建,我不知道为什么)。这个命令卸载旧版本安装新版本并在设备上运行应用程序。
- 确保在
proj.android/libs/armeabi
目录下有以下文件:gdb.setup, gdbserver, libcocos2dcpp.so
- 还要确保在
/proj.android/jni/obj/local/armeabi
目录下有以下文件:app_process, gdb.setup, libc.so, linker
ndk-gdb
(重要!此命令应该在项目目录中调用,而不是在jni
目录中调用)
如果成功了,恭喜您!但是在此步骤中,您可能会看到如下错误消息:
Nareks-MacBook-Pro:proj.android 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:
别担心 :). 让我们看看问题出在哪里:
这是在项目的jni
目录中调用ndk-build DUMP_APP_ABI
命令的结果:
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.
如您所见,缺少NDK_MODULE_PATH
变量。要获取该值,请执行以下操作。转到编译代码的步骤。在执行命令cocos compile -p android -m debug --ndk-mode NDK_DEBUG=1
的第一行中,您将看到类似以下内容的东西:
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 NDK_MODULE_PATH=/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'
- 从上面日志中复制您看到的
NDK_MODULE_PATH
的必要值。执行以下命令:export NDK_MODULE_PATH=/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
(注意复制您的路径而不是我的)。
就是这样。现在在设备上运行游戏,cd proj.android
,调用ndk-gdb
,您应该能够使用gdb进行调试。
我个人已经寻找这种类型的教程超过20天了。希望您已经享受到调试的乐趣了。 :) 感谢@VikasPatidar在ndk-build DUMP_APP_ABI
步骤中的帮助!
编辑1:如Vikas所评论的那样,您可以像这样在Android.mk
文件中添加NDK_MODULE_PATH
:
NDK_MODULE_PATH := $(LOCAL_PATH)/../../../../cocos
NDK_MODULE_PATH += $(LOCAL_PATH)/../../../../external
编辑2: 如果你的应用程序崩溃了,那么有一种非常强大且易于使用的方法可以通过防止直接调试来调查问题:
adb logcat | $NDK_ROOT/ndk-stack -sym $PROJECT_PATH/obj/local/armeabi
它打印出崩溃转储。
.a
和.so
文件(libcocos2d.a
、libcocos2dcpp.so
、libbox2d.a
),还有两个目录:objs
和objs_debug
。在每个目录中,我都有以下目录:box2d_static
、cocos2dcpp_shared
、cocos_extension_static
等。这些目录中又包含其他带有对象文件的目录。这正确吗? - Narekndk-build DUMP_APP_ABI
结果。 - Narekndk-build DUMP_APP_ABI
后,我发现缺少了NDK_MODULE_PATH
。我调用了cocos compile -p android -m debug --ndk-mode NDK_DEBUG=1
命令,这个命令显示了应该设置的NDK_MODULE_PATH
。我将NDK_MODULE_PATH
导出到/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
,问题得到了解决。 - Narekndk-gdb
的终端中设置路径吗?第二个问题:APP_PLATFORM
表示什么?它是应用程序应该编译的最低Android API还是其他什么? - Narek