剛開始做NDK 開發的時候,Android Studio 還沒提供了 native C/C++ 設置斷點 調試,我們都是通過輸出 日誌來調試,這樣費時耗力。Android Studio 應該是在 2.2 版本才提供的設置斷點 debug 功能,同時在該版本也提供了 cmake 編譯。 我目前在做 N ...
剛開始做NDK 開發的時候,Android Studio 還沒提供了 native C/C++ 設置斷點 調試,我們都是通過輸出 日誌來調試,這樣費時耗力。Android Studio 應該是在 2.2 版本才提供的設置斷點 debug 功能,同時在該版本也提供了 cmake 編譯。
我目前在做 NDK 開發的時候,還是習慣用 NDK-Build(也就是設置 Android.mk) 來開發,我先簡單說一下怎麼用輸出日誌來調試:
1、首先在 Android.mk 設置MODULE 添加日誌庫,如下代碼:
include $(CLEAR_VARS) LOCAL_MODULE := ndktest LOCAL_SRC_FILES := native_lib.c LOCAL_LDLIBS += -llog include $(BUILD_SHARED_LIBRARY)
2、然後在 native_lib.c 實現文件添加:
#include <android/log.h> //為了方便調用,將輸出巨集定義 #define LOG_TAG "NATIVE_OUTPUT" #define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)) #define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__))
3、最後就能在 native_lib.c 實現文件的 方法里輸出日誌了,如:
LOGI("run here"); LOGI("run i=%d", i);
上述是比較繁瑣的調試方法,每次寫完日誌,又要重新編譯一下代碼。現在敘述一下怎麼搭建 native C/C++ 斷點調試方法:
1、首先要把你的 Android Studio 升級到 2.2 或更高,且在Module下 build.gradle 的buildToolsVersion 參數 要 設置 25 或以上: buildToolsVersion '25.0.0'
2、如果你是新創建項目, 你可以在New Project 時候, 在 Application name 選項下 有個覆選框(Include C++ support) 選上,IDE 在構建項目的時候,會幫你配置好了 debug 環境。
3、如果你是從舊項目移植過來的(也就是以前用 Android.mk配置),你可以打開 Module下 build.gradle文件
defaultConfig節點中,添加ndk,如下:
ndk { moduleName "imagetool" abiFilters "armeabi"//編譯支持的平臺 // .. 根據自己的 Application.mk 的配置,按 gradle 規則配置一下 }
然後在Android 的節點中,添加 externalNativeBuild 節點:
externalNativeBuild { ndkBuild { // Android.mk 的相對路徑 path "src/main/jni/Android.mk" } }
接著 sync Project 同步一下項目,你會看見項目多了幾個文件夾:
當你點擊 Run Debug 按鈕 右邊 的Attach debugger to Android process 按鈕,如果有 Native、Dual 選擇:
當你點擊 Run Debug 按鈕 右邊 的Attach debugger to Android process 按鈕,如果有 Native、Dual 選擇:
說明你配置成功了, 可以在 native-lib.c 實現文件 設置斷點來調試了。 上述截圖 彈框 是debuger 配置,預設是 auto 選項,你可以設置 成 native 用來debug 你的natvie 代碼。
debug 到 native 的時候如下:
你可以使用 LLDB 作為你的Debug 輔助工具, LLDB怎麼使用,這一章不細說,你可以查閱其它資料。
參考資料:
https://developer.android.google.cn/studio/debug/index.html
https://developer.android.google.cn/index.html (Android 大陸官網)
tips:假設你已經配置好了NDK開發環境,以及 LLDB 插件。
在 debug的時候如下出現如下錯誤:
Error:FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:externalNativeBuildDebug'.
> Build command failed.
Error while executing process E:\Android\Sdk\ndk-bundle\ndk-build.cmd with arguments {NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=G:\project\Android\Anti-shake-arithmetic\app\src\main\jni\Android.mk NDK_APPLICATION_MK=G:\project\Android\Anti-shake-arithmetic\app\src\main\jni\Application.mk APP_ABI=armeabi NDK_ALL_ABIS=armeabi NDK_DEBUG=1 APP_PLATFORM=android-15 NDK_OUT=G:/project/Android/Anti-shake-arithmetic/app/build/intermediates/ndkBuild/debug/obj NDK_LIBS_OUT=G:\project\Android\Anti-shake-arithmetic\app\build\intermediates\ndkBuild\debug\lib G:/project/Android/Anti-shake-arithmetic/app/build/intermediates/ndkBuild/debug/obj/local/armeabi/libNDKUtils.so}
[armeabi] StaticLibrary : libclapack1.a
process_begin: CreateProcess(NULL, E:/Android/Sdk/ndk-bundle/build//../toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin/arm-linux-androideabi-ar crsD ....
很有可能是你 defaultConfig節點中,ndk 節點的配置信息與 Application.mk 不匹配,需要你 在ndk 節點添加上去