大家都知道Android是基于Linux构建的一个框架(framework),而他底层真正的系统还是Linux,那么我们是否可以设计直接可以运行于底层Linux系统的可执行程序(process)呢,答案是肯定的,本文就举一个例子来说明这个做法。这个例子要达到的效果是检测Android手机CPU的能力(当然要达到这个目的,有很多方法,如直接查看cat /proc/cpuinfo即可,但是本文以此为例想达到2个目的:一、利用NDK自带的工具编写动态监测CPU能力的程序;二、演示如何利用NDK编写直接运行于linux的进程):

1)首先看手机使用的CPU是否是arm体系结构的CPU,因为google 要和Intel合作了,X86体系的也要出来了;

2) 查看Android手机CPU有几个核,是多核还是单核?

3)查看手机CPU是否支持ARM的NEON技术,是否支持VFPv3指令集,是否是ARMv7体系结构(注意ARMv7是指ARM 的 CPU架构的Version7, 他和ARM7是完全不一样的概念)。

闲话少说,按照如下步骤一步一步来:

1)在自己的工作空间(workspace,如/root/workspace)中建一个目录cpudetect,用了存放这个project;然后再在cpudetect下建一个jni目录,我们的C程序就放在jni目录下;

2)在jni目录下建2个文件,一个C源文件,一个按NDK格式要求的Makefile;如下:

/* cpudetect.c */
 #include<stdio.h>
 #include<cpu-features.h>

 int main(void) {

         AndroidCpuFamily cpuFamily = android_getCpuFamily();
         int cpuCoreCnt = android_getCpuCount();

         printf("CPU family (hex): %u", cpuFamily);

         if(cpuFamily == ANDROID_CPU_FAMILY_ARM) {
                 printf("-ARM\n");
         } else if(cpuFamily == ANDROID_CPU_FAMILY_X86) {
                 printf("-X86\n");
         } else {
                 printf("-unknown\n");
         }

         printf("Number of CPU Cores (hex): %u\n", cpuCoreCnt);

         if(cpuFamily == ANDROID_CPU_FAMILY_ARM) {
                 uint64_t cpuFeatures = android_getCpuFeatures();

                 printf("CPU features (hex): %llu\n", cpuFeatures);

                 if(cpuFeatures & ANDROID_CPU_ARM_FEATURE_NEON) {
                         printf("NEON: Arm NEON is supported.\n");
                 } else {
                         printf("NEON: Arm NEON is not supported.\n");
                 }

                 if(cpuFeatures & ANDROID_CPU_ARM_FEATURE_ARMv7) {
                         printf("ARCH: ARMv7.\n");
                 } else {
                         printf("ARCH: not are ARMv7.\n");
                 }

                 if(cpuFeatures & ANDROID_CPU_ARM_FEATURE_VFPv3) {
                         printf("VFPv3 is supported.\n");
                 } else {
                         printf("VFPv3 is not supported.\n");
                 }
         }
         return 0;
 }

注意,以上程序使用了NDK自带的动态监测CPU能力的API,这个API本质上就是读取linux下的/proc/cpuinfo,这个API可提供给应用程序动态获取CPU能力的方法。

#Android.mk
 LOCAL_PATH := $(call my-dir)

 include $(CLEAR_VARS)
 LOCAL_MODULE    := cpudetect
 LOCAL_SRC_FILES := cpudetect.c
 LOCAL_STATIC_LIBRARIES := cpufeatures

 include $(BUILD_EXECUTABLE)

 $(call import-module,android/cpufeatures)



注意:以上程序演示了2个小机巧:如何通过include $(BUILD_EXECUTABLE)关键字编译可执行程序,以及如何编译和使用NDK自带的cpufeature。

3)进入cpudetect目录,cd cpudetect;
 4)ndk-build; (注意前提是要把$NDK/bin加入到你的path中);
 5)用adb push把你编译出来的可执行程序push到你手机里,插入手机到USB上,执行:
 adb push libs/armeabi/cpudetect /data/local/myapp/cpudetect
 (注意,提前先在你手机的/data/local/下面建一个myapp目录),此处另外一个注意的地方是可执行程序安装的地方不可以是sdcard上的任何一个目录,否则会提示"permission denied"错误。
 6)adb shell, 
 7)#chmod a+x /data/local/myapp/cpudetect
 8)cd /data/local/myapp/
 9)./cpudetect 即可看到输出。