前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ndk代码支持断点调试

ndk代码支持断点调试

作者头像
MelonTeam
发布2018-01-04 17:08:42
3.7K0
发布2018-01-04 17:08:42
举报
文章被收录于专栏:MelonTeam专栏MelonTeam专栏

背景

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,添加

代码语言:javascript
复制
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地址。

代码语言:txt
复制
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编程的同学都可以试试。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-04-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 迁移步骤
  • 补充
  • 断点调试和自动补全
  • 其它
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档