有几种方法可以在代码中检查 CPU 功能,每种方法都有不同的权衡。
ABI:使用预处理器的预定义宏
通常最方便的方法是在构建时使用 #ifdef
结合以下内容确定 ABI:
__arm__
用于 32 位 ARM__aarch64__
用于 64 位 ARM__i386__
用于 32 位 X86__x86_64__
用于 64 位 X86
请注意,32 位 X86 被称为 __i386__
,而不是您可能期望的 __x86__
!
CPU 核心数量:使用 libc 的 sysconf(3)
sysconf(3) 允许您查询 _SC_NPROCESSORS_CONF
(系统中的 CPU 核心数)和 _SC_NPROCESSORS_ONLN
(当前在线的 CPU 核心数)。
功能:使用 libc 的 getauxval(3)
在 API 级别 18 及更高版本中,Android 的 C 库中提供了 getauxval(3)。 AT_HWCAP
和 AT_HWCAP2
参数返回列出特定于 CPU 的功能的位掩码。请参阅 NDK 中的各种 hwcap.h
头文件以获取要比较的常量,例如 arm64 的 SHA512 指令的 HWCAP_SHA512
,或 arm 的 Thumb 整数除法指令的 HWCAP_IDIVT
。
Google cpu_features 库
AT_HWCAP
的一个问题是,有时设备会出错。例如,某些旧设备声称具有整数除法指令,但实际上没有。
Google 的 cpu_features 库通过应用其自身对特定 SoC 的了解(通过解析 /proc/cpuinfo
以确定相关联的特定 SoC)来解决此类问题。
此库由 Google 的第一方应用团队维护,并针对他们在野外遇到的每个有问题的设备提供了解决方法。
NDK cpufeatures 库(已弃用)
NDK 仍然提供一个名为 cpufeatures
的已弃用库,以保持与已使用该库的应用的源代码兼容性。与更新且更完整的 cpu_features 库不同,此历史库对许多特定 SoC 并没有解决方法。