Android进阶(jni部分三)ABI

ABI ,不同的Android设备有不同的CPU,而不同的CPU有不同的指令集。CPU与指令集的每种组合都有专属二进制。ABI包含信息:

  • 可使用的 CPU 指令集(和扩展指令集)。
  • 运行时内存存储和加载的字节顺序。Android 始终是 little-endian。
  • 在应用和系统之间传递数据的规范(包括对齐限制),以及系统调用函数时如何使用堆栈和寄- 存- 器。
  • 可执行二进制文件(例如程序和共享库)的格式,以及它们支持的内容类型。Android 始终使用ELF。如需了解详情,请参阅 ELF System V 应用二进制接口。
  • 如何重整 C++ 名称。如需了解详情,请参阅 Generic/Itanium C++ ABI。

支持的ABI

ABI和支持指令集

ABI 支持的指令集 备注
armeabi-v7a armeabi、Thumb、 VFPv3-D16 与ARMv5/v6设备不兼容
arm64-v8a AArch64
x86 x86 (IA-32)、MMX、SSE2/3、SSSE3
x86_64 x86-64、MMX、SSE/2/3、 POPCNT、 SSE4.1、4.2
  • armeabi-v7a

    此 ABI 适用于基于 32 位 ARM 的 CPU。Android 变体包含 Thumb-2 和 VFP 硬件浮点指令(具体而言就是 VFPv3-D16),其中包含 16 个专用 64 位浮点寄存器。

    如需详细了解 ABI 中并非特定于 Android 的部分,请参阅 ARM 架构的应用二进制接口 (ABI)

    默认情况下,NDK 编译系统会生成 Thumb-2 代码,除非您在 ndk-build 的 Android.mk 中使用 LOCAL_ARM_MODE,或在配置 CMake 时使用 ANDROID_ARM_MODE

    包括高级 SIMD (Neon) 在内的其他扩展指令集都是可选的。如需了解详情,请参阅 NEON 支持。

    armeabi-v7a ABI 使用 -mfloat-abi=softfp 来强制实施以下规则:虽然系统可以执行浮点代码,但编译器在调用函数时必须传递整数寄存器中的所有 float 值以及整数寄存器对中的所有 double 值。

  • arm64-v8a

    此 ABI 适用于基于 ARMv8-A 的 CPU,支持 64 位 AArch64 架构。它包含高级 SIMD (Neon) 架构扩展指令集。

    您可以在 C 和 C++ 代码中使用 Neon 内建函数来充分利用高级 SIMD 扩展指令集。针对 Armv8-A 的 NDK 编程人员指南详细介绍了 Neon 内建函数和 Neon 编程的概况。

    如需了解 ABI 中并非特定于 Android 的部分的完整详情,请参阅 Arm 的了解架构。Arm 还针对64 位 Android 开发提供了一些移植方面的建议。

    在 Android 中,特定于平台的 x18 寄存器专用于 ShadowCallStack,不应由您的代码使用。当前的 Clang 版本默认使用 Android 中的 -ffixed-x18 选项,因此除非您使用的是手写编译器(或非常旧的编译器),否则无需担心这一点。

  • x86

    此 ABI 适用于支持通常称为“x86”、“i386”或“IA-32”的指令集的 CPU。此 ABI 的特性包括:

    这些标记指向 Pentium Pro 指令集,以及 MMX、SSE、SSE2、SSE3 和 SSSE3 扩展指令集。生成的代码在顶层 Intel 32 位 CPU 之间进行了均衡优化。

  • X86_64

    这些标记指向 x86-64 指令集(根据 GCC 文档),以及 MMX、SSE、SSE2、SSE3、SSSE3、SSE4.1、SSE4.2 和 POPCNT 扩展指令集。生成的代码在顶层 Intel 64 位 CPU 之间进行了均衡优化。

你可能感兴趣的:(android开发,android,c++,编程语言)