Android:找出运行该线程的核心

时间:2014-01-14 13:11:51

标签: android multithreading concurrency android-ndk java-native-interface

我正在尝试为Android编写代码,它会给我一些处理器的信息(id?)和运行线程的核心。

我已经谷歌和grep'ed一些灵感的来源,但没有运气。我所知道的是,我很可能需要一些C / C ++调用。

我的工作如下:

#include <jni.h>

int getCpuId() {
    // missing code
    return 0;
}

int getCoreId() {
    // missing code    
    return 0;
} 

JNIEXPORT int JNICALL Java_com_spendoptima_Utils_getCpuId(JNIEnv * env,
        jobject obj) {
    return getCpuId();
}

JNIEXPORT int JNICALL Java_com_spendoptima_Utils_getCoreId(JNIEnv * env,
        jobject obj) {
    return getCoreId();
}

整个项目编译并运行得很好。我能够从Java中调用函数,我得到了正确的响应。

这里有人可以填补空白吗?

2 个答案:

答案 0 :(得分:4)

这似乎对我有用:

//...
#include <sys/syscall.h>
//...
int getCpuId() {

    unsigned cpu;
    if (syscall(__NR_getcpu, &cpu, NULL, NULL) < 0) {
        return -1;
    } else {
        return (int) cpu;
    }
}
//...

答案 1 :(得分:3)

好消息是,必要的库和系统调用是在Android(sched_getcpu()__getcpu())上定义的。坏消息是,它们不属于NDK。

您可以使用this answer中显示的方法滚动自己的系统调用包装和库调用。

另一种方法是阅读/proc/self/stat并解析processor条目。 proc(5) man page描述了格式:

  /proc/[pid]/stat
         Status  information  about  the process.  This is used by ps(1).
         It is defined in /usr/src/linux/fs/proc/array.c.
  ...
         processor %d (since Linux 2.2.8)
                     CPU number last executed on.

这个速度要慢得多,如果更新内核,“文件”格式可能会改变,所以这不是推荐的方法。