Android 下检测CPU的能力

先做一个声明:本文是直接转载于http://keyewan.blog.163.com/blog/static/189827233201191385434571/。在此自行做一个备份,方便日后自己查看。


大家都知道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 即可看到输出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值