Here is the step-by-stet tutorial to debug cocos2d-x 3.x on Android device. Please correct or optimize my steps if you do it in better way.
cd proj.android
cocos compile -p android -m debug --ndk-mode NDK_DEBUG=1
(to build with debug info)
cocos run -p android -m debug
to deploy on device (sometimes it rebuilds, and I don't know why). This command uninstalls former installation, installs the new one and runs the app on the device.
- make sure in
proj.android/libs/armeabi
directory you have the following files gdb.setup, gdbserver, libcocos2dcpp.so
- also make sure that in
/proj.android/jni/obj/local/armeabi
directory you have app_process, gdb.setup, libc.so, linker
ndk-gdb
(important! this should be called in projects directory, not in jni
directory)
If it worked then congratulations! But in this step you may see such error message:
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:
Don't worry :). Lets see what is wrong:
here is the result of ndk-build DUMP_APP_ABI
command called in project's jni
directory:
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.
As you can see NDK_MODULE_PATH
is missing. For obtaining the value do the following. Go to step where you compiled code. In first linse of execution of command cocos compile -p android -m debug --ndk-mode NDK_DEBUG=1
you can see something like this:
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'
- copy from the log above you see the necessary value of
NDK_MODULE_PATH
. Execute the following command 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
(be attentive to copy your path not mine)
That's it. Now run game on device, cd proj.android
, call ndk-gdb
and you should be able to debug with gdb.
I personally looked for this kind of tutorial already more than 20 days. I hope you enjoy your debugging already. :) And thank you @VikasPatidar for your help with ndk-build DUMP_APP_ABI
step!
EDIT1: As commented Vikas you can add NDK_MODULE_PATH
in Android.mk
file like this:
NDK_MODULE_PATH := $(LOCAL_PATH)/../../../../cocos
NDK_MODULE_PATH += $(LOCAL_PATH)/../../../../external
EDIT2: If your app crashed here is a very powerful and easy way to investigate the problem by preventing direct debugging:
adb logcat | $NDK_ROOT/ndk-stack -sym $PROJECT_PATH/obj/local/armeabi
It prints the crash dump.
proj.android\obj\local\armeabi
andproj.android\obj\local\armeabi-v7a
directories? – Organza.a
and.so
files (libcocos2d.a, libcocos2dcpp.so, libbox2d.a
) and also two directories:objs
andobjs_debug
. In each of these directories I have the following directoriesbox2d_static, cocos2dcpp_shared, cocos_extension_static...
. In its turn in there directories there are object files of other directories with object files. Is this correct? – Emotionalizendk-build DUMP_APP_ABI
to find correct ABI and then change it inApplication.mk
Also make sureAPP_PLATFORM
is same as running on device. e.g. android-10 is for Android 2.3.3 is version of running device then also updateAndroidManiefest.xml
to correct target and minimum versions. Set them asandroid:minSdkVersion="10" android:targetSdkVersion="10"
Keep both as same. I have tried with cocos2dx 3.0 version with NDK-r9d in Eclipse. – Organzandk-build DUMP_APP_ABI
in my edit question text. – Emotionalizendk-build DUMP_APP_ABI
I saw thatNDK_MODULE_PATH
is missing. I calledcocos compile -p android -m debug --ndk-mode NDK_DEBUG=1
. This command shows theNDK_MODULE_PATH
that should be set. I have exprotedNDK_MODULE_PATH
to/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
and it solved the problem. – Emotionalizendk-gdb
? And second question: what denotesAPP_PLATFORM
? Is it the minimum Android API or which the app should be compiled? – EmotionalizeAPP_PLATFORM
as a target platform used inlocal.properties
– Organza