使用安卓NDK 交叉编译动态库、静态库基础入门

前言

本篇博客将详细介绍如何在 Windows 环境下使用 Android NDK 交叉编译 C 文件,生成静态和动态库,并在 Android 项目中使用这些库。


设置开发环境

由于编译需要在Linux环境中进行,如果你的电脑是Windows的,可以下载Ubuntu LTS 或者使用 VMware Workstation 15 Player 使用 Ubuntu 镜像都行,注意:不使用虚拟机的话使用 Windows 版本的NDK编译即可,使用虚拟机 因为完全是Linux环境,所以要下载Linux版本的NDK!我两种方式都试过了,个人感觉Ubuntu LTS 还是方便一些,接下来就开始一步一步介绍如何使用 Ubuntu LTS 进行交叉编译。

启用 WSL

WSL 允许在 Windows 上运行 Linux 环境,这对于使用 Android NDK 进行交叉编译至关重要。

  1. 启用 WSL 功能:
    在 Windows 搜索栏中输入“启用或关闭 Windows 功能”,然后勾选“适用于 Linux 的 Windows 子系统”选项。点击“确定”并重启电脑。

安装 Ubuntu

  1. 安装 Ubuntu:
    打开 Microsoft Store,搜索并安装 Ubuntu 18.04 或更高版本。

  2. 初始化 Ubuntu:
    安装完成后,启动 Ubuntu,设置用户名和密码。

安装 GCC 和 G++

  1. 更新包列表并安装构建工具:
    打开 Ubuntu 终端,执行以下命令:
sudo apt update
sudo apt install build-essential

编译器概述

编译器 概述 特点
GCC(GNU Compiler Collection) GNU项目开发的编译器集合,支持多种编程语言,包括C、C++、Fortran等。 - 开源免费:遵循GPL许可,广泛应用于开源项目。
- 跨平台支持:支持Linux、Windows、macOS等多种操作系统和硬件架构。
- 强大的优化能力:提供多种优化选项,生成高效的目标代码。
G++ GCC中的C++编译器驱动程序,专门用于编译C++源代码。 - 支持C++标准:兼容C++11、C++14、C++17、C++20等标准。
- 处理C++特性:全面支持模板、面向对象编程、多态、异常处理等。
- 集成链接功能:简化编译过程,负责编译和链接阶段。
Clang 基于LLVM项目的开源编译器前端,支持C、C++、Objective-C等语言。 - 快速编译速度:通常比GCC更快,提升开发效率。
- 友好的错误信息:提供清晰、详细的编译错误和警告。
- 模块化设计:易于与其他工具集成,支持插件和自定义扩展。
- 高可扩展性:适应不同的开发需求,支持静态分析和代码格式化工具。

编译C/C++文件的原理

阶段 作用 过程 输出
预处理(Preprocessing) 处理源代码中的预处理指令,如#include#define等。 - 宏展开:替换宏定义。
- 文件包含:插入头文件内容。
- 条件编译:决定保留或忽略代码段。
生成扩展后的纯文本代码。
编译(Compilation) 将预处理后的源代码转换为中间表示(如汇编代码)。 - 词法分析:分解源代码为词法单元。
- 语法分析:组织成语法树(AST)。
- 语义分析:类型检查、作用域解析等。
- 优化:消除冗余、循环优化等。
- 代码生成:生成汇编代码或中间代码。
生成汇编代码文件(.s)或中间代码文件。
汇编(Assembly) 将汇编代码转换为目标机器码,生成目标文件。 - 指令翻译:将汇编指令转换为机器码。
- 地址分配:为符号分配内存地址。
生成目标文件(.o或.obj)。
链接(Linking) 将多个目标文件和库文件组合,生成最终的可执行文件或库文件。 - 符号解析:解决符号引用。
- 地址重定位:分配最终内存地址。
- 库链接:链接外部库函数和资源。
生成最终的可执行文件或静态/动态库文件。

基础编译步骤

在开始交叉编译之前,了解基础的编译过程有助于理解后续步骤。

创建一个简单的C文件,文件名test.c ,内容如下:

#include <stdio.h>

int main() {
   
    printf("Hello from Android NDK!\n");
    return 0;
}

预处理阶段

预处理阶段处理 #include#define 等预处理指令。

gcc -E test.c -o test.i
  • -E:预处理后停止编译,输出预处理结果。

编译阶段

将预处理后的代码编译为汇编代码。

gcc -S test.i -o test.s
  • -S:编译后生成汇编代码。

汇编阶段

将汇编代码转换为目标文件。

gcc -c test.s -o test.o
  • -c:编译并汇编,生成目标文件,不进行链接。

链接阶段

将目标文件链接生成可执行文件。

gcc test.o -o test
./test

输出:

Hello from Android NDK!

一步到位编译

将所有步骤合并为一步:

gcc test.c -o test
./test

输出:


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值