文章目录
- 概述
- ABI(Application Binary Interface)
- abiFilter
- NDK(Native Development Kit)
- JNI(Java Native Interface)
- 它们之间的联系
概述
- 只是简单介绍,可能描述不够精准,但可以帮助你快速理解大概。
ABI(Application Binary Interface)
- 定义了 CPU 架构的二进制接口规范(如 armeabi-v7a、arm64-v8a)【ABI是接口规范】。
- 关于.so,可以理解为接口规范的实现如下:
- .so 文件是针对特定 ABI 编译的,不同 ABI 需要不同的 .so 文件。
- .so可以简单理解为是一种c/c++编写的库(动态链接库,类似windows的.dll文件)
abiFilter
- 用于在 Gradle 配置中指定支持的 ABI 架构,从而只打包对应的 .so 文件,减少 APK/AAB 体积。
- 题外话:APK和AAB都是包,只不过AAB是上谷歌商店用到。
NDK(Native Development Kit)
- 由 Google 提供的工具集,允许开发者使用 C/C++ 等原生语言为 Android 平台开发高性能的代码模块。
- 通过 NDK 编译 C/C++ 代码可以生成 .so 文件(动态链接库)。
- 注意,不是一定要编写C/C++代码才用到NDK,项目有.so文件就可能需要NDK的,比如动态加载、JNI交互、构建工具链都需要NDK的支持。
JNI(Java Native Interface)
- 简单来说是 Java/Kotlin 与本地代码(C/C++)交互的桥梁。
- 具体是 Java 提供的一种机制,允许 Java 代码调用本地(如 C/C++)代码,或本地代码调用 Java 代码,常用于性能优化或与底层系统交互。
- 通过 System.loadLibrary(“example”) 在运行时加载 .so 文件,并调用其中的本地方法。
它们之间的联系
- 用 NDK 编译 C/C++ 代码生成 .so 文件(针对特定 ABI)。
- 然后通过 abiFilter 配置需要支持的 ABI 架构。
- 最后在运行时通过 JNI 加载和使用 .so 文件。
- 实例如下:
android {defaultConfig {ndk {abiFilters 'armeabi' }}
}dependencies {implementation 'xxx'
}