Android-音视频学习系列-(二)-交叉编译动态库、静态库的入门学习

本文介绍了Android音视频开发中的交叉编译概念,详细讲解了NDK的用途、环境变量配置以及如何在Linux环境下进行交叉编译。通过示例,展示了如何编译静态库和动态库,并对比了两者之间的区别。还探讨了makefile和cmake在构建C/C++ Android项目中的应用,包括它们的基本语法和用法。
摘要由CSDN通过智能技术生成
  1. 预处理阶段

预处理阶段主要处理 include 和 define 等。它把 #include 包含进来的 .h 文件插入到 #include 所在的位置,把源程序中使用到的用 #define 定义的宏用实际的字符串代替。

我们可以通过以下命令来对 c/c++ 文件预处理,命令如下:

gcc -E test.c -o test.i //-E 的作用是让 gcc 在预处理结束后停止编译

可以看到输入该命令之后就会生成一个 test.i 文件。

  1. 编译阶段

在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作。

我们可以通过如下命令来处理 test.i 文件,编译成汇编文件,命令如下:

gcc -S test.i -o test.s//-S 的作用是编译结束生成汇编文件。

  1. 汇编阶段

汇编阶段把 .S 文件翻译成二进制机器指令文件 .o ,这个阶段接收.c ,.i ,.s 的文件都没有问题。

下面我们通过以下命令生成二进制机器指令文件 .o 文件:

gcc -c test.s -o test.o

  1. 链接阶段

链接阶段,链接的是函数库。可以通过以下命令实现:

gcc -C test.o -o test
./test

最后我们通过实际操作,对编译有了一定的了解,当然你也可以直接通过如下命令一步到位:

gcc test.c -o test

到这里我们成功的在 linux 平台生成了可执行文件,试想一下我们可以将这个可执行文件拷贝到安卓手机上执行吗?我们也不猜想了,实际测试下就行,我们把 test 可执行文件 push 到手机 /data/local/tmp 里面, 如下所示:

可以看到 test 在手机 /data/local/tmp 的路径下是有可读可写可执行的权限,但是最后执行不成功,这是为什么呢? 其实 主要原因是两个平台的 CPU 指令集不一样,根本就无法识别指令。那么怎么解决这个问题呢? 下面就要用到今天一个比较重要的知识点了, 利用 Android NDK 工具包来对 C/C++ 代码进行交叉编译

交叉编译

简单地来说,交叉编译就是程序的编译环境和实际运行环境不一致,即在一个平台上生成另一个平台上的可执行代码。

在音视频开发中了解交叉编译是很有必要的,因为无论在哪一种移动平台下开发,第三方库都是需要进行交叉编译的。下面我们就以之前的例子来讲解如何在 linux 环境下交叉编译出移动平台上的可执行代码。

了解 NDK

Android 原生开发包 (NDK) 可用于 Android 平台上的 C++ 开发,NDK 不仅仅是一个单一功能的工具,还是一个包含了 API 、交叉编译器、调试器、构建工具等得综合工具集。

下面大致列举了一下经常会用到的组件。

  • ARM 交叉编译器
  • 构建工具
  • Java 原生接口头文件
  • C 库
  • Math 库
  • 最小的 C++ 库
  • ZLib 压缩库
  • POSIX 线程
  • Android 日志库
  • Android 原生应用 API
  • OpenGL ES 库
  • OpenSL ES 库

下面来看一下 Android 所提供的 NDK 跟目录下的结构。

  • ndk-build: 该 Shell 脚本是 Android NDK 构建系统的起始点,一般在项目中仅仅执行这一个命令就可以编译出对应的动态链接库了。
  • ndk-gdb: 该 Shell 脚本允许用 GUN 调试器调试 Native 代码,并且可以配置到 AS 中,可以做到像调试 Java 代码一样调试 Native 代码。
  • ndk-stack: 该 Shell 脚本可以帮组分析 Native 代码崩溃时的堆栈信息。
  • build: 该目录包含 NDK 构建系统的所有模块。
  • platforms: 该目录包含支持不同 Android 目标版本的头文件和库文件, NDK 构建系统会根据具体的配置来引用指定平台下的头文件和库文件。
  • toolchains: 该目录包含目前 NDK 所支持的不同平台下的交叉编译器 - ARM 、X86、MIPS ,目前比较常用的是 ARM 。构建系统会根据具体的配置选择不同的交叉编译器。

下面我们就来为交叉编译的环境变量配置

环境变量配置

  • ndk 在 Linux 上的环境变量配置:

//1. vim /etc/profile
#NDK环境变量
export NDK_HOME=/root/android/ndk/android-ndk-r17c
export PATH= P A T H : PATH: PATH:NDK_HOME

//2. 保存
source /etc/profile

//3. 测试
ndk-build -v

如果出现如下字样,就证明配置成功了。

  • 13
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值