如何在Android设备上调试cocos2d-x 3本地代码

10

我找不到任何关于如何在Android上以调试模式构建cocos2d-x 3.1项目并直接在设备上进行调试的菜谱/教程。请帮忙指出步骤。

我的操作和遇到的问题:

  • cd proj.android
  • cocos compile -p android -m debug --ndk-mode NDK_DEBUG=1(构建时添加调试信息)
  • cocos run -p android -m debug 部署到设备上
  • 在设备上运行应用程序
  • cd jni
  • 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: 

我已经在Application.mk中添加了:

APP_ABI := armeabi armeabi-v7a
APP_PLATFORM := android-10

但这没有帮助。我做错了什么?

编辑:添加在项目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.

@VikasPatidar,这些目录中我有一些.a.so文件(libcocos2d.alibcocos2dcpp.solibbox2d.a),还有两个目录:objsobjs_debug。在每个目录中,我都有以下目录:box2d_staticcocos2dcpp_sharedcocos_extension_static等。这些目录中又包含其他带有对象文件的目录。这正确吗? - Narek
@VikasPatidar,感谢您的帮助。请查看我在编辑问题文本中的ndk-build DUMP_APP_ABI结果。 - Narek
@VikasPatidar 我觉得你救了我的命 :) 在使用 ndk-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,问题得到了解决。 - Narek
太好了,它起作用了!!! 我通常会在Android.mk文件中添加此路径。 这是一个示例http://pastebin.com/Pd3gY1p3 - Vikas Patidar
@VikasPatidar 谢谢。但是我不应该在调用ndk-gdb的终端中设置路径吗?第二个问题:APP_PLATFORM表示什么?它是应用程序应该编译的最低Android API还是其他什么? - Narek
显示剩余3条评论
1个回答

25
这是一个关于如何在安卓设备上调试cocos2d-x 3.x的逐步教程。如果您有更好的方法,请纠正或优化我的步骤。
  1. cd proj.android
  2. cocos compile -p android -m debug --ndk-mode NDK_DEBUG=1(以带有调试信息的方式构建)
  3. cocos run -p android -m debug在设备上部署应用程序(有时会重新构建,我不知道为什么)。这个命令卸载旧版本安装新版本并在设备上运行应用程序。
  4. 确保在proj.android/libs/armeabi目录下有以下文件:gdb.setup, gdbserver, libcocos2dcpp.so
  5. 还要确保在/proj.android/jni/obj/local/armeabi目录下有以下文件:app_process, gdb.setup, libc.so, linker
  6. 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: 

别担心 :). 让我们看看问题出在哪里:

  1. 这是在项目的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'
  1. 从上面日志中复制您看到的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

它打印出崩溃转储。


4
谢谢你,特别是最后的EDIT2。我以前从未见过那个。 - John O'Connor
我的项目已经成功构建。但是在proj.android/libs/armeabi目录下,我没有gdb.setup、gdbserver这些文件,只有libcocos2dcpp.so。我该如何获取它们? - Rahul Iyer
@John -m debug --ndk-mode NDK_DEBUG=1 不会创建那些文件吗? - Narek
没有。我有cocos2d-x v 3.7、NDK r10c和Android SDK 22。NDK工具链版本是4.9。我不知道这些是否重要,因为我以前没有制作过任何Android应用程序。 - Rahul Iyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接