NDK 工具链假设在函数调用之前进行 16 字节堆栈对齐。默认工具和选项会强制实施此规则。如果编写的是汇编代码,必须确保堆栈对齐,而且其他编译器也遵守此规则。
请参阅以下文档了解更多详情:
- GCC 在线文档:Intel 386 和 AMD x86-64 选项
- 不同 C++ 编译器和操作系统的调用规范
- Intel IA-32 Intel 架构软件开发者手册第 2 卷:指令集参考
- Intel IA-32 Intel 架构软件开发者手册第 3 卷:系统编程指南
- System V 应用二进制接口:Intel386 处理器架构补充
x86_64
此 ABI 适用于支持通常称为“x86-64”的指令集的 CPU。它支持 GCC 通常使用以下编译器标记生成的指令:
-march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel
这些标记指向 x86-64 指令集(根据 GCC 文档),以及 MMX、SSE、SSE2、SSE3、SSSE3、SSE4.1、SSE4.2 和 POPCNT 扩展指令集。生成的代码在顶层 Intel 64 位 CPU 之间进行了均衡优化。
如需了解有关编译器标记的更多信息,特别是与性能优化相关的信息,请参阅 GCC x86 性能。
此 ABI 不含任何其他可选的 x86-64 扩展指令集,例如:
- MOVBE
- SHA
- AVX
- AVX2
您仍可使用这些扩展指令集,只要您使用运行时功能探测来启用它们,并且为不支持它们的设备提供回退机制。
请参阅以下文档了解更多详情:
为特定 ABI 生成代码
默认情况下,NDK 指向所有非弃用 ABI。您可通过在 Application.mk 文件中设置 APP_ABI 来指向单个 ABI。以下代码段演示了使用 APP_ABI 的几个示例
APP_ABI := arm64-v8a # Target only arm64-v8a
APP_ABI := all # Target all ABIs, including those that are deprecated.
APP_ABI := armeabi-v7a x86_64 # Target only armeabi-v7a and x86_64.
要详细了解您可以为 APP_ABI 变量指定的值,请参阅 Android.mk。
编译系统的默认行为是将每个 ABI 的二进制文件包括在单个 APK(也称为胖 APK)内。与仅

本文详细探讨了Android平台上的CPU架构,重点介绍了x86_64和ARM系列的ABI,包括如何为特定ABI生成代码,以及如何处理CPU特性。Android系统在安装时会自动解压缩适合目标设备的原生代码。文章还提到了NDK工具链的使用,如编译器标志和预处理器宏,以检测和利用CPU功能,如SSSE3、AES和SHA指令集。此外,还讨论了CPU核心计数的检测方法和如何在Android.mk中使用cpufeatures库。
最低0.47元/天 解锁文章
,android组件化开发通信&spm=1001.2101.3001.5002&articleId=122702025&d=1&t=3&u=faca95eb14ef4e4790fb66c7e31a3886)
2949

被折叠的 条评论
为什么被折叠?



