不同的Android手机使用不同的CPU,而不同的 CPU 支持不同的指令集,CPU 与指令集的每种组合都有专属的应用二进制接口,即 ABI。
ABI包含的信息
- 机器代码应使用的 CPU 指令集。
- 运行时内存存储和加载的字节顺序。
- 可执行二进制文件(例如程序和共享库)的格式,以及它们支持的内容类型。
- 在代码与系统之间传递数据的各种规范。这些规范包括对齐限制,以及系统调用函数时如何使用堆栈和寄存器。
- 运行时可用于机器代码的函数符号列表 - 通常来自非常具体的库集。
NDK支持的ABI
NDK以前支持MIPS,MIPS64,armeabi,但在NDK r17 移除了对这些ABI的支持,其中,MIPS,MIPS64使用的很少可忽略。
armeabi不支持硬件辅助的浮点运算,所有浮点运算都使用编译器的 libgcc.a 静态库中的软件辅助函数。
ABI | 支持的指令集 |
---|---|
armeabi | ARMV5TE 和更高版本,Thumb-1 |
armeabi-v7a | armeabi,Thumb-2,VFPv3-D16 |
arm64-v8a | AArch64 |
x86 | x86 (IA-32),MMX ,SSE/2/3,SSSE3 |
x86_64 | x86-64,MMX |
ABI和CPU的关系
大多数CPU都支持多种ABI,但是为了获得最佳性能,最好使用CPU的主要ABI。
CPU | 主要ABI | 支持的ABI |
---|---|---|
ARMv5 | armeabi | armeabi |
ARMv7 | armeabi-v7a | armeabi ,armeabi-v7a |
ARMv8 | arm64-v8a | armeabi ,armeabi-v7a,arm64-v8a |
x86 | x86 | armeabi ,armeabi-v7a ,x86 |
x86_64 | x86_64 | armeabi ,x86 ,x86_64 |