ndk代码支持断点调试

背景

android的ndk代码编写一直被认为是很痛苦的一件事情,除了android程序员对c++的陌生外,还有一个主要原因是无法断点调试。无法断点调试很难发现和排查问题,大大影响开发效率。实际上android studio从2.2开始就完全支持ndk开发,并且可以进行断点调试。

实际应用中发现,真正使用新版studio构建c/c++工程的项目极少。这里有个误区是android studio其实是支持ndk-build和cmake两种构建方式的,但是几乎所有的博客在给教程的时候都是用的官方推荐的cmake构建方式。老项目使用ndk-build构建,工程大的mk文件也很复杂,迁移和学习成本都很大。ndk-build和cmake只是编译方式的不同,两者均可以利用lldb进行断点调试,对于其它功能支持也是一样的。

从大的方向上来看,使用cmake构建很美好,cmake作为通用跨平台编译方案,以后肯定有更好的前景。但是对于android本身来说,大家相对都更熟悉ndk-build方案,而如果都能支持相同的功能,显然直接把ndk-build方案迁移过去成本最小。

迁移步骤

下面给出ndk代码的迁移步骤(以下假设你的工程结构是studio工程结构)。build.gradle整体配置如下:

0、首先,在app/src/main/中新建cpp文件夹,将原工程jni中的文件全部复制过来到cpp文件夹中。

1、配置ndk编译参数。注意有些博客提到可以设置arguments参数ndk_application_mk来支持原工程的application.mk配置文件,这个配置在最新版本的android studio实际验证无效。这一步实际上相当于application.mk文件的迁移。cppflags对应的就是application.mk中的app_cppflags配置,abifilters对应的是app_abi配置,其它参数配置则移到arguments中。2、配置android.mk路径。这里是根据build.gradle设置的相对路径3、添加支持的架构。官方工程给的方法是配置productflavors参数

两种配置方法的区别在于,配置defaultconfig中的ndk的abifilters参数,android studio会将所有的架构so打包到一个apk中,但是如果使用productflavors,将会根据不同架构打包不同的apk。google play是支持根据架构下发不同apk到手机上的,但是国内的应用市场不支持。因此如果要在国内上线建议还是使用abifilters参数的方式。4、打开gradle.properties,添加

android.usedeprecatedndk=true

这是因为工程仍然继续使用ndk-build构建方式

官方文档上给了一个选择gradle关联外部cmake和ndk-build的可视化界面的方法。操作是打开project窗格并选择android视图,右键点击您想要关联到原生库的模块(例如 app 模块),并从菜单中选择 link c++ project with gradle。然后就可以看到这样的一个对话框

但是我试着操作了一下,发现没有找到 link c++ project with gradle的选项。不过这个操作最终也是改gradle文件,我们直接修改gradle文件就行。

补充

如果有现有的so想要添加进去,可以在app/src/main中新建jnilibs文件夹,根据架构放入相应的so

使用android studio编译c/c++不会单独生成so,不过可以使用android studio的apk 分析工具查看生成的so。 选择build->analyze apk,从app/build/outputs/apk/目录中选择apk并点击ok。这时候可以在lib//下看到相应的so

断点调试和自动补全

点击run app按钮,android studio会提示你下载缺失的组件,按照操作下载即可。 如果没有配置过ndk地址,需要在local.properties中配置ndk地址。

ndk.dir=/users/zhangpengyu/documents/android/android-ndk-r12

运行后断点,attach到对应进程,等待lldb(android studio用于断点调试的工具)设置完成即可断点到对应工程。

此时我们可以直接在android studio中编辑c++代码,支持自动补全,方法跳转。以及ide所有的其它常见操作,如格式化代码,重构变量名,查看引用等

其它

作为强迫症知道官方推荐用cmake,就是想把项目切换成cmake构建怎么办。我自己试了一下把ffmpeg用cmake编译。其实这部分也有不少文章介绍,但是几乎所有的文章都是链接ffmpeg编译出的动态库。但是实际应用中,我们很少会把ffmpeg编译成动态库再做链接,因为这样安装包过大。我试着使用ffmpeg编译的静态库再使用cmake编译,出现如下错误。有知道如何解决麻烦告诉我

虽然ndk-build编译方案目前官方已经不再推荐,但是大部分时候来说,项目能够快速迁移ndk代码支持断点调试是第一位的。而在长期的历史进程中,我们也相信,google是一家有立场的公司。绝对不会像苹果公司一样,swift语言一个版本是一门语言,并且根本不向下兼容。不尊重开发者,一升级xcode就是不能用。ndk-build构建方式以后可能会不支持,但是那应该也是swift发布10.0版本的时候了。 # 总结 将ndk代码迁移到android studio中,让c++代码支持断点调试,自动补全,能大大提高我们的开发效率。需要在android中用到ndk编程的同学都可以试试。

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏iOS122-移动混合开发研究院

【最新版】从零开始在 macOS 上配置 Lua 开发环境

脚本语言,你可能更需要的是 Lua 不同的脚本语言有不同的特性,第一接触的脚本语言,可能会影响自己对整个脚本语言的理解和认知。我以前接触最多的脚本语言是 Jav...

3085
来自专栏程序员互动联盟

【答疑释惑】如何知道电脑是32位还是64位

近来在联盟中经常看到有人问64位系统与32位系统的问题。这里把相关问题几种回答下。 首先我们要明白一个常识,64位操作系统可以使用32位系统的软件,但是32位系...

2703
来自专栏地方网络工作室的专栏

特殊配列 GH60 键盘设计组装笔记

特殊配列 GH60 键盘设计组装笔记 上次用 XD60 制作了一块特殊配列的键盘。虽然用着非常满意,但是终究不是用 GH60 的标准制作的。因此,心里一直很痒痒...

3127
来自专栏性能与架构

前端构建工具grunt

grunt是什么 grunt是目前非常流行的前端构建工具,支持自定义插件,有丰富的插件帮助我们完成构建任务 自动化完成我们指定的任务,例如压缩、编译、单元测试、...

3315
来自专栏云豹直播系统开发

怎么搭建短视频系统?全套负载均衡方案

短视频系统跟直播系统有一样的特点,面向的用户群体数量较大,聚集时间点集中。比如午饭时间,晚上休闲时间。所以做好系统的负载特别重要,既能提高系统的稳定性和可用性,...

1834
来自专栏张戈的专栏

借助腾讯云 CDN 开启全站 https 及问题解决分享

腾讯云 CDN 的 https 功能目前还在邀请测试阶段,有幸用上了国内这个为数不多的特权。在借助腾讯云 CDN 开启全站 https 的过程中遇到了非常多的问...

6K1
来自专栏静下来

CDN加速下通过nginx获取网站访客真实ip

image.png 我们官网后台有访客防火墙,为了统计用户的登录信息,由于网站做了全站的CDN,所以防火墙默认获取到的ip全是CDN的ip。 这样就不便于我们...

5016
来自专栏腾讯移动品质中心TMQ的专栏

【 Android 场景化性能测试】内存性能及内存泄漏篇

承接《Android场景化性能测试-方向与框架篇》,本篇详述内存性能的具体测试方案和内存泄漏问题简单定位方法。

2901
来自专栏黑白安全

数以万计 Django 应用程序因配置错误泄露密码等敏感信息

近日,安全研究员 FábioCastro 发现 28,165 个配置错误的 Django 应用程序暴露敏感信息,其中包括密码,API 密钥以及 AWS 访问令牌...

956
来自专栏张善友的专栏

SQL Server 2005的负载均衡

SQL Server 2005仍然不直接地支持负载均衡——但是它为以前SQL Server版本中可用的所有负载均衡方法提供了令人激动的改善和支持。   目录 1...

20110

扫码关注云+社区