我正在尝试为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中调用函数,我得到了正确的响应。
这里有人可以填补空白吗?
答案 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.
这个速度要慢得多,如果更新内核,“文件”格式可能会改变,所以这不是推荐的方法。