Android NDK CPU Features detection library:
-----------------------------------------------------------
NDK 提供了一个很小的库叫着“cpufeatures”,可用于运行时检测目标设备的CPU类型和它支持的可选功能。
用法:
--------
这个库是作为一个import module来使用的。为了使用它,你必须:
* 在静态库依赖的列表中列出‘cpufeatures’,如:
LOCAL_STATIC_LIBRARIES := cpufeatures
* 在Android.mk的尾部,导入‘android/cpufeatures’模块,如:
$(call import-module, android/cpufeatures)
* 在源代码中,导入头文件<cpu-features.h>。
下面有一个例子:
<project-path>/jni/Android.mk:
LOCAL_PATH :=$(call my-dir)
include$(CLEAR_VARS)
LOCAL_MODULE :=<your-module-name>
LOCAL_SRC_FILES:= <your-source-files>
LOCAL_STATIC_LIBRARIES:= cpufeatures
include$(BUILD_SHARED_LIBRARY)
$(callimport-module,android/cpufeatures)
功能:
-------------
现在提供了两个函数:
AndroidCpuFamily android_getCpuFamily();
返回目标设备CPU类型的枚举值。目前,支持的类型只有ANDROID_CPU_FAMILY_ARM。
uint64_t android_getCpuFeatures();
返回目标设备CPU支持的可选功能的集合。返回的结果是bit-flags的集合,每一位对应一个CPU特定类型的可选功能。
目前,对于ARM CPU家族,只有下面的这些flags被定义:
ANDROID_CPU_ARM_FEATURE_ARMv7
表明设备的CPU支持ARMv7-A指令(通过“armeabi-v7a”abi设置,请查看CPU-ARCH-ABIS相关内容),这对应于Thumb-2和VFPv3-D16指令。
ANDROID_CPU_ARM_FEATURE_VFPv3
表明目标设备CPU支持VFPv3的硬件FPU指令集扩展。由于‘armeabi-v7a’的定义,如果ANDROID_CPU_ARM_FEATURE_ARMv7返回,它将永远保持这样。
注意,这对应最低配置的VFPv3-D16,只提供16个硬件FP寄存器。
ANDROID_CPU_ARM_FEATURE_NEON
表明设备的CPU支持ARM高级SIMD(又称NEON)矢量指令集扩展。注意ARM授权实现了VFPv3-D32的CPUs,VFPv3-D32提供了32个硬件浮点寄存器(共享NEON单元)。
下面这些flags是针对x86 CPU家族的:
ANDROID_CPU_X86_FEATURE_SSSE3
表明目标设备支持SSSE3指令集扩展。注意这个和需要x86NDK ABI的SSE3不同。
ANDROID_CPU_X86_FEATURE_POPCNT
表明目标设备支持POPCNT指令。
ANDROID_CPU_X86_FEATURE_MOVBE
表明目标设备支持MOVBE指令。像Atom,这个特定于一些Intel IA-32 CPUs。
下面这个函数被定义为,返回目标设备CPU内核的最大个数:
int android_getCpuCount(void);
重要提示:
----------------
在以后的版本中,cpufeatures库会支持更多的CPU种类和可选功能,它已经正式被设计成为所有官方Android平台版本的一部分了。
修改历史:
----------------
请查看$NDK/sources/android/cpufeatures/cpu-features.c里面的注释,了解这个库完整的修改历史记录。
转载于:https://blog.51cto.com/ikinglai/1214745