NDK开发,如何配置 debug环境
刚开始做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 节点添加上去
NDK开发,如何配置 debug环境的更多相关文章
- NDK配置debug环境时:Error:FAILURE: Build failed with an exception
Error:FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:ex ...
- 使用AndroidStudio进行NDK开发简单配置
1. 准备工作 在实际写代码之前,首先我们还是需要做一些准备工作: 下载NDK开发包:Android官方下载页面 配置系统环境变量 下载好NDK开发包之后,直接解压到任意目录,然后需要配置一下系统环境 ...
- 【NDK开发】android-ndk r10环境搭建
1)打开Android开发者的官网http://developer.android.com/找到Develop点击.如果页面打不开,通过代理来访问. 2)进入后再点击Tools 3)进入后在左侧找到N ...
- Android NDK 开发(一)--环境搭建【转】
转载请注明出处:http://blog.csdn.net/allen315410/article/details/41800955 Android下的NDK开发是Android开发中不可或缺的一部分, ...
- Android NDK开发 Jni中Debug(三)
下载LLDB 配置Android Native - Debugger 调式结果如下 #include <jni.h> #include <string.h> #include& ...
- 使用Android Studio 1.3 版本号进行NDK开发
众所周知Android Studio 1.3 版本号新增了NDK支持,能够非常方便的在上面开发C++或者C代码了,但是预览版功能不是非常完好,须要非常多步骤,另一些奇怪的BUG,整了半天最终能够使用A ...
- NDK 开发实例一(Android.mk环境配置下)
在我写这篇文章的时候,Android Studio已经是2.3版本了,已经集成CMake 编译工具, 用户只需在 新建项目的时候,添加选项(Include C++ support),Andr ...
- Eclipse下Android的NDK开发环境配置
编辑2016年7月26日——增加了下载网址,修改了一些错误. 摸索了一周,走了很多弯路,磕磕绊绊,总算是弄好了NDK的开发环境,在这里总结一下吧. 一.Android NDK开发环境 首先下载安装JR ...
- Mac os x下配置 Android ndk 开发环境
1.阅读下面之前,请确保你android sdk的开发环境已经搭建好,ADT也最好是目前最新的. 2.到http://developer.android.com/tools/sdk/ndk/index ...
随机推荐
- shell实例练习+详解
想着将Shell与Python和Java等脚本比较比较,当一有这个念头我就放弃了.这太侮辱Shell了.(哭笑脸!) 作为一个程序员,Linux那是最基本要求.而shell脚本有时候也会显示它在Lin ...
- 使用layui-tree美化左侧菜单,点击生成tab选项
layui-tree美化左侧菜单 html <div class="layui-side layui-bg-black"> <div class="la ...
- python3 第十三章 - 数据类型之tuple(元组)
元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可: language = ('c', 'c++', 'py ...
- 在Tomcat中配置单点登录
单点登录:Single Sign-On .概述 一旦你设置了realm和验证的方法,你就需要进行实际的用户登录处理.一般说来,对用户而言登录系统是一件很麻烦的事情,你必须尽量减少用户登录验证的次数.作 ...
- Css的优先级机制
样式的优先级 多重样式(Multiple Style):如果外部样式.内部样式.内联样式同时应用于同一个元素,就是使用多重样式的情况. 一般情况优先级如下: (外部样式)External style ...
- JavaSE基础篇—流程控制语句—方法的定义 调用和重载
1.定义方法 是封装在一起来执行操作语句的集合,用来完成某个功能操作,简单的说就是提取出来的有特定功能的代码(程序).在某些语言中被称为函数或者过程,比较特殊的方法是main方法(主方法),main方 ...
- 关于int main( int argc, char *argv[] )
int main(int argc, char *argv[], char *env[]) 1. int argc 表示你在命令行下输入命令的时候,一共有多少个参数. 2. char *argv[] ...
- Servlet第六篇【Session介绍、API、生命周期、应用、与Cookie区别】
什么是Session Session 是另一种记录浏览器状态的机制.不同的是Cookie保存在浏览器中,Session保存在服务器中.用户使用浏览器访问服务器的时候,服务器把用户的信息以某种的形式记录 ...
- gulp最简示例
全局安装 $ npm gulp -g 作为项目的开发依赖安装 $ npm gulp --save-dev 脚本文件 在根目录创建gulpfile.js文件 const gulp = require(' ...
- 16_Python闭包
一.什么是闭包 什么是闭包:内函数对外函数非全局变量的引用,并且外函数的返回值是内函数的引用(地址). def wrapper(): name = 'zhangsan' def inner(): na ...