文章目录

  • 一、在 Android Studio 中创建 Native C++ 工程
  • 二、C/C++ 源码编译过程
  • 三、Makefile 工具
  • 四、CMake 引入

该系列博客的应用场景是 Android Studio 下 NDK 编程 , 使用 CMake 构建 C/C++ 工程 ;

一、在 Android Studio 中创建 Native C++ 工程


在 Android Studio 中创建 Native C++ 工程 :

设置工程相关属性 , 名称 , 包名 , 存放地址 , 以及语言, 这里选择 Google 官方推荐的 Kotlin 语言 , 尽量避免使用 Java ;

选择 C++ 标准 , 默认即可 ;

关于自动生成的模板参考 【Android NDK 开发】Kotlin 语言中使用 NDK ( 创建支持 Kotlin 的 NDK 项目 | Kotlin 语言中使用 NDK 要点 | 代码示例 ) 博客 , 其中有完整的代码示例 ;

二、C/C++ 源码编译过程


上述 Native C++ 工程中的 C++ 代码是在 CMake\app\src\main\cpp 目录下的 native-lib.cpp ;

如果将该 native-lib.cpp 源码打包成 Kotlin 或 Java 中通过 JNI 可调用的 so 动态库 , 需要使用 Make 工具进行编译 ;

Make 工具需要使用 Makefile 命令 , 如 " g++ native-lib.cpp " , 编译的默认输出结果是 a.out 文件 ;

如果指定默认名字就使用 " gcc native-lib.cpp -o main " , 此时编译输出的结果是 main 文件 ;

gcc native-lib.cpp 命令执行的完整的编译过程 , 包括 预处理 , 编译 , 汇编 , 链接 四个过程 , 参考 【C 语言】编译过程 分析 ( 预处理 | 编译 | 汇编 | 链接 | 宏定义 | 条件编译 | 编译器指示字 ) 博客 ;

编译过程 : 预处理 -> 编译 -> 汇编 -> 链接;

  1. 编译预处理 : 产生 .i 后缀的预处理文件;
  2. 编译操作 : 产生 .s 后缀的汇编文件;
  3. 汇编操作 : 产生 .o 后缀的机器码二进制文件;
  4. 链接操作 : 产生可执行文件 ;

三、Makefile 工具


如果源码个数较少可以直接使用 " gcc native-lib.cpp native-lib2.cpp … " 命令 , 逐个将源码添加在 gcc 之后 , 如果源码个数太多 , 达到几百上千个 , 此时就需要使用 Makefile 编译工具了 , 编写 Makefile 脚本 , 然后直接执行该脚本 , 即可完成数量庞大的源码编译工作 ;

Makefile 参考 【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境) 博客 ;

Makefile 脚本示例 : 这是拷贝自上面的博客 , 用于编译汇编文件的脚本 ;

all: led.o @arm-linux-ld -Tled.lds -o led.elf $^@arm-linux-objcopy -O binary led.elf led.binled.o : led.Sarm-linux-gcc -g -o $@ -c $^.PHONY: clean
clean:rm *.o led.elf led.bin

在 Makefile 的当前目录 , 执行 make 命令 , 会自动执行 Makefile 脚本中的编译命令 ;

四、CMake 引入


Makefile 在 Linux 下有其固定的编写格式 , 在 Windows 下有另外一种编写格式 , 不同的平台的 Makefile 的编写格式都不同 , 非常不利于跨平台 ;

CMake 解决了上述 Makefile 跨平台问题 , 使用 CMake 可以完美处理在不同平台之间的 Makefile 不兼容的问题 ;

CMake 可以生成不同平台的 Makefile 文件 ;

【CMake】CMake 引入 ( Android Studio 创建 Native C++ 工程 | C/C++ 源码编译过程 | Makefile 工具 | CMake 引入 )相关推荐

  1. Android Studio创建安卓项目工程

    Android Studio创建安卓项目工程 前言 因为想抽出时间复习考研因此提前接触安卓的一些开发,在实训的时候就可以不用再听讲学习,节省时间 随着前端混合开发和小程序技术的兴起,安卓开发的需求在日 ...

  2. 【Android Gradle】安卓应用构建流程 ( Java 源码编译 和 AIDL 文件编译 )

    文章目录 一.安卓应用构建简介 二.Java 源码编译 三.AIDL 源码编译 一.安卓应用构建简介 使用 Android Studio 开发 Android 应用时 , 编译应用后在 Module ...

  3. android源码编译过程

    1.下载好android源码包. 2.装好vm,ubuntu(如果能在实体机装linux更好). 3.安装所需要的deb包 在终端执行如下命令: sudo apt-get install flex b ...

  4. Android 4.1 (Jelly Bean) 源码编译过程总结

    昨天google官方发布了Android 4.1 Jelly Bean的源码,本人第一时间将源码托了下来(托了一个通宵),今天又花了一早上时间编译ROM并刷到自己的Galaxy Nexus中,虽说An ...

  5. 【错误记录】Android Studio 中查看 Gradle 配置的方法源码 ( 配置 gradle-wrapper.properties 中版本为 gradle-x.x.x-all.zip )

    文章目录 一.报错信息 二.解决方案 Android Plugin DSL Reference 参考文档 : https://google.github.io/android-gradle-dsl/2 ...

  6. 不翻qiang搞定Android Studio Google库加载不下来的问题 打包生成apk android studio 3.2打灰机程序源码带详细注释

    1.Google库加载不下来的问题 其实我们可以给dl.google.com设置个代理,然后库都能正常加载下来了.步骤如下: 打开站长工具网站,http://ping.chinaz.com/dl.go ...

  7. android 4.4 源码编译,Android 4.4源码编译过程

    Android源码下载完后的目录如下: 整个代码的大小为:25.559GB. 一.构建系统 如下用于构建Android源码树的指令应用于所有的代码分支,包括master分支.喎?http://www. ...

  8. 简诉android源代码编译过程,Android源码编译过程及原理(二)

    在未来等风也等你 本节主要记录的内容anroid 编译系统的结构 编译中枢中main.mk的基本解析 除非特别说明本节中的目录都是基于android的源码目录 1. android 编译系统的结构 a ...

  9. 简述android源代码的编译过程,Android源码编译过程详述

    首先说一下,编译Android所用的系统,目前ubuntu是比较好的平台,也是官方推荐的,但具体版本,说的都比较少,为了避免大家走弯路,我 这里说一下,最好的就是ubuntu 8.10,他所带有的各个 ...

最新文章

  1. java实现https请求
  2. MFC程序在控制台输出的实现
  3. Weblogic IIOP反序列化漏洞(CVE-2020-2551) 漏洞分析
  4. 手机进水的正确处理方法?
  5. 第5月第8天 jsonmodel
  6. linux 后台一直执行的sh
  7. Java自学笔记(16):常用类:Math,Data和Calender,Format,Scanner
  8. mysql 指定数字排序_Mysql数据排序
  9. 基本农田卫星地图查询_如何基于西安80坐标查询定位
  10. 使用Chrome保存网页为mht文件
  11. 以中划线开头正则表达式_正则表达式 汉字、数字、字母、横杠
  12. 山寨笔记本电脑风暴要来了
  13. linux信号处理编程实验报告,实验二进程通信-Linux实验报告
  14. 计算机财务管理期末考试题及答案,计算机财务管理期末考工资部分题目及答案...
  15. java制作qq机器人(脚本实现和调用QQ官方api实现)
  16. 【易语言界面开发系列教程之(EX_UI使用系列教程(12)--EX组件(列表框EX))】
  17. SecureCRT 完美代替超级终端
  18. 寄生虫技术计算机软件怎么样,2019寄生虫软件-某寄生虫软件分析
  19. 中国移动校招面试( 计算机、大数据、通信专业相关岗位)一面
  20. C语言之while循环

热门文章

  1. 轻松学MVC4.0–4 扩展UserProfile
  2. VM虚拟机常见问题之五--网络相关的问题
  3. 【Vegas原创】添加SQL Server Agent作业步骤中的运行身份
  4. Oracle配置方面问题收集
  5. Flask-Migrate拓展数据库表结构
  6. hive的用户和用户权限
  7. 开始逆向objc基础准备(一)简单认识一下arm32,以及与x86汇编指令类比
  8. 利用dynamic解决匿名对象不能赋值的问题
  9. Javascript编程基础1
  10. javaScript年份下拉列表框内容为当前年份及前后50年