Android NDK (一)相关的术语

349 阅读3分钟

什么是 NDK

Android NDK 是指 Android Native Development Kit(Android 原生开发套件),这套工具可以是我们能在 Android 应用中使用 C 和 C++ 代码。

NDK的应用场景

在以下场景下,推荐使用原生代码:

  • 在不同平台间移植应用程序。
  • 重复使用现有库,或者提供其自己的库供重复使用。
  • 在特定情况下提高性能,特别是像游戏这种计算密集型应用。

NDK 相关概念

JNI

JNI 即 Java Native Interface,是 Java 编程语言的一部分,它提供了一种机制,使得 Java 代码能够调用其他语言(如 C、C++)编写的函数,也允许 C、C++ 代码调用 Java 方法。

ABI

ABI 即 Application Binary Interface(应用二进制接口),它定义了应用程序(尤其是使用 C、C++ 编写的部分)与底层操作系统和硬件之间的二进制接口规范。在 Android NDK 中,ABI 决定了原生代码如何在不同的硬件架构(如 ARM、x86 等)上运行,不同的 ABI 对应不同的 CPU 架构和指令集,开发者在使用 NDK 开发时,需要针对不同的 ABI 进行编译,以确保应用能在各种设备上正确运行。

CMake 和 ndk-build

CMakendk-build 都是用来构建 C++ 的工具。其中 ndk-build 是 Android NDK 自带的传统构建系统;而新项目默认建议使用 CMake,而不是 ndk-build 来构建 C++。

Clang 和 GCC

我们都知道 C++ 构建需要经过 预处理、编译、汇编、链接等步骤,一般这些步骤都是通过编译器来完成的。在过去的Android 版本使用的是 GCC,而在现在 GCC 已经被建议废弃,默认使用 Clang 来替代 GCC。

image.png

关于 Clang 和 GCC 具体见 简述Clang 与LLVM 以及其关系 - michaelchengjl - 博客园

LLDB

LLDB 是 Android Studio 用于调试原生代码的调试程序。详细介绍见 Andorid Studio NDK开发-LLDB调试 - 简书

静态库和动态库

  • 静态库(.a): 静态库是在编译阶段被包含进去的,它会把你的目标文件(比如可执行文件、共享库)需要的代码直接复制一份到目标文件中。所以你的目标文件体积会变大,但是你在运行它时不需要担心库不在,因为所有的代码都已经包含在了里面。

  • 动态库(.so): 动态库是在运行阶段才会被加载的,你的目标文件(比如可执行文件、共享库)在编译的时候不会包含动态库中的代码,而是会在运行目标文件的时候去加载和链接动态库。这意味着我们在运行目标文件的时候必须确保动态库在适当的位置可供加载。

Prefab

Prefab是谷歌公司提供的C/C++ 库依赖生成工具。当我们要对外提供native依赖库时,可以通过prefab包的方式,这样在生成的 .aar文件中会有一个prefab文件夹,用来保存native库文件和头文件

参考