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-v7aabi设置,请查看CPU-ARCH-ABIS相关内容),这对应于Thumb-2VFPv3-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-D32CPUsVFPv3-D32提供了32个硬件浮点寄存器(共享NEON单元)。

 
  


下面这些flags是针对x86 CPU家族的:


ANDROID_CPU_X86_FEATURE_SSSE3

表明目标设备支持SSSE3指令集扩展。注意这个和需要x86NDK ABISSE3不同。


      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里面的注释,了解这个库完整的修改历史记录。