Android Studio如何Debug对应so文件C/C++代码

在C/C++跨平台开发中,我们知道在Windows上可以通过VS,进行单步断点调试,这非常方便。但是我们如果编译好的动态库so,想要跟踪下其流程及各个阶段,如,怎么跟踪FFmpeg/VLC等库内部demux流程,或是Codec流程呢?今天通过一个小Demo进行Debug库文件C/C++代码。

一,下载 NDK 和构建工具 要编译和调试本地代码(native code),你需要下面的组件:

  • 1、The Android Native Development Kit (NDK) : 让你能在 Android 上面使用 C 和 C++ 代码的工具集。
  • 2、CMake 外部构建工具。如果你准备只使用 ndk-build 的话,可以不使用它。
  • 3、LLDB : Android Studio 上面调试本地代码的工匠。

注意:要在 Android Studio 中 使用 CMake 或者 ndk-build,你需要使用 Android Studio 2.2 或更高的版本,同时需要 配合使用 Android Plugin for Gradle 2.2.0 及以上的版本。

安装上述组件:

  • 如SDK Tools 不显示LLDB,CMake 和NDK,说明你配置了国内镜像站点!
  • 要能上google官网才会显示,之前也是通过国内镜像,一直没显示出来!

Tools > Android > SDK Manager >点击 SDK Tools 选项卡。 勾选 LLDB,CMake 和 NDK 。

已单独下载了 android-ndk-r11b所这里不再下载NDK!(最好勾选下载最新NDK) 点击 Apply ,然后点击 OK 。

二,新建项目:

1、勾上 include C++ support

2、在最后一步时可选择不同的C++库

说明: 虽说是支持C/C++,但是不完全支持C/C++的全部特性,必须得按照 jni的约定来:具体可以参照 jni手册 C++ Standard: 选择C++库

  • Toolchain Default: 默认 CMake 设置
  • C++ 11:支持C++11特性!
  • Exceptions Support(-fexceptions):

如果你想使用有关 C++ 异常处理的支持,就勾选它。勾选之后,Android Studio 会在 module 层的 build.gradle 文件中的 cppFlags 中添加 -fexcetions 标志。

  • Runtime Type Information Support(-frtti): 如果你想支持 RTTI,那么就勾选它。勾选之后,Android Studio 会在 module 层的 build.gradle 文件中的 cppFlags 中添加 -frtti 标志。

说明:

  • native-lib.cpp: 自动生成的C++源文件
  • CMakeLists.txt: CMake 脚本根据构建脚本的指令去编译一个 C++ 源文件,也就是 native-lib.cpp ,并将编译后的产物扔进共享对象库中,并将其命名为 libnative-lib.so ,然后 Gradle 将其打包到 APK 中。
  • External Build Files 存放 CMake 或 ndk-build 构建脚本的地方。有点类似于 build.gradle 文件告诉 Gradle 如何编译你的 APP 一样,CMake 和 ndk-build 也需要一个脚本来告知如何编译你的 native library。

1、只需配置android标签节点下的buildTypes

buildTypes{
       debug{
       jniDebuggable true        
       jniDebuggable = true
   }
}

2、配置AndroidManifest属性:android:debuggable="true"

<application android:label="@string/app_name" 
android:debuggable="true"> 
<activity android:name=".HelloJni"                           
android:label="@string/app_name">
<intent-filter>
    <action android:name="android.intent.action.MAIN" /> 
<category android:name="android.intent.category.LAUNCHER" /> 
 </intent-filter> 
 </activity>
 </application>

3、配置Run/Debug configurations

  • a、选择run下拉item,选Edit Configurations,弹出配置窗体
  • b、点击➕新建 configuraionts,选android native条目
  • c、配置下native执行的名称如:hellojniNative.
  • d、选择真机或模拟器调试.

断点调试运行

图1

图2

图1,图2是两种进行运行app-native的方式,选择app-native后,debug->app-native; 接下来就可以在C/C++文件中进行单步调试了。

这里暂留一个问题,如果是已经编译好的带符号表的动态库.so文件,如何进行调试呢?有兴趣读者可以留言交流下。

原文发布于微信公众号 - 何俊林(DriodDeveloper)

原文发表时间:2017-12-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏kwcode

无法向会话状态服务器发出会话状态请求

无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。如...

2845
来自专栏腾讯BBTeam团队的专栏

基于 Docker 分分钟搭建起 Golang 开发环境

虽然 Golang 的开发环境相对容易搭建,但是使用 docker 的优势是能方便的切换 golang 的版本,而且开发环境对开发时所使用的机器没有任何的依赖,...

5594
来自专栏一个会写诗的程序员的博客

Springboot使用velocity模板引擎第五章 使用velocity模板引擎

最爽的Web组合开发就是Intellij IDEA + Maven + Spring Boot + Scala + Velocity + Boostrap + ...

2643
来自专栏IT 指南者专栏

SpringMVC 框架系列之组件概述与配置详解

微信公众号:compassblog 欢迎关注,互相学习,共同进步! 有任何问题,请后台留言联系! 在上一篇文章 SpringMVC 框架系列之初识与入门实例 的...

3027
来自专栏程序猿DD

【译】Spring 官方教程:使用 Restdocs 创建 API 文档

原文:Creating API Documentation with Restdocs 译者:HoldDie 校对:Jitianyu 本指南将引导你了解在 Sp...

1.9K5
来自专栏芋道源码1024

网关 Spring-Cloud-Gateway 源码解析 —— 调试环境搭建

本文主要基于 Spring-Cloud-Gateway 2.0.X M4 摘要: 原创出处 http://www.iocoder.cn/Spring-Cloud...

3684
来自专栏哎_小羊

初试Jenkins2.0 Pipeline持续集成

初试Jenkins2.0 Pipeline持续集成 目录: Jenkins 2.0介绍 环境、软件准备 安装、启动并配置jenkins服务 新建Pipelin...

27410
来自专栏jianhuicode

构建ReactJs项目node-sass编译出错

npm run dev本地项目出错 问题栈 verbose Please try running this command again as root/Adm...

23610
来自专栏Spring相关

第5章—构建Spring Web应用程序—SpringMVC详解

第二步:前端控制器请求HandlerMapping查找 Handler (可以根据xml配置、注解进行查找)

1654
来自专栏王磊的博客

Spring Boot 最佳实践(二)集成Jsp与生产环境部署

提起Java不得不说的一个开发场景就是Web开发,也是Java最热门的开发场景之一,说到Web开发绕不开的一个技术就是JSP,因为目前市面上仍有很多的公司在使用...

2495

扫码关注云+社区

领取腾讯云代金券