您的位置:首页 > 运维架构 > Linux

编写在Android的Linux系统中直接运行的可执行程序 - 检测CPU能力

2011-09-28 16:25 746 查看
原创文章 - 转载注明出处:http://blog.csdn.net/abnerchai/ E-mail: ajaxchai@gmail.com

大家都知道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 即可看到输出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐