您可以通过多种方式检查代码中的 CPU 功能,但每种方式都需要做出不同的取舍。
ABI:使用预处理器的预定义宏
通常,在构建时使用 #ifdef
及以下各项确定 ABI 最为方便:
- 对于 32 位 ARM,使用
__arm__
- 对于 64 位 ARM,使用
__aarch64__
- 对于 32 位 X86,使用
__i386__
- 对于 64 位 X86,使用
__x86_64__
请注意: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 设置权宜解决方法。