linux下可以直接调用pthread_setaffinity_np,将当前线程绑定在具体的cpu上,而android该API被屏蔽了,需要调用sched这个系统API,详情见下面代码:

package nativelibs;public class Affinity {    static {        System.loadLibrary("Affinity");    }    public static native void bindToCpu(int cpu);}

void set_cur_thread_affinity(int mask) {    int err, syscallres;    pid_t pid = gettid();    syscallres = syscall(__NR_sched_setaffinity, pid, sizeof(mask), &mask);    if (syscallres) {        err = errno;        LOGE("Error in the syscall setaffinity: mask = %d, err=%d",mask,errno);    }    LOGD("tid = %d has setted affinity success",pid);}

ok,具体的JNI代码如下:

#include #include #include #include #include #include #include #define TAG "Affinity"#define DEBUG 1#ifndef CPU_ZERO#define CPU_SETSIZE 1024#define __NCPUBITS  (8 * sizeof (unsigned long))typedef struct{    unsigned long __bits[CPU_SETSIZE / __NCPUBITS];} cpu_set_t;#define CPU_SET(cpu, cpusetp) \  ((cpusetp)->__bits[(cpu)/__NCPUBITS] |= (1UL << ((cpu) % __NCPUBITS)))#define CPU_ZERO(cpusetp) \  memset((cpusetp), 0, sizeof(cpu_set_t))#else#define CPU_SET(cpu,cpustep) ((void)0)#define CPU_ZERO(cpu,cpustep) ((void)0)#endif#ifdef DEBUG#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__)#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG,__VA_ARGS__)#else#define LOGD(...) ((void)0)#define LOGE(...) ((void)0)#endifvoid set_cur_thread_affinity(int mask) {    int err, syscallres;    pid_t pid = gettid();    syscallres = syscall(__NR_sched_setaffinity, pid, sizeof(mask), &mask);    if (syscallres) {        err = errno;        LOGE("Error in the syscall setaffinity: mask = %d, err=%d",mask,errno);    }    LOGD("tid = %d has setted affinity success",pid);}static int getCores() {    return sysconf(_SC_NPROCESSORS_CONF);}JNIEXPORT int JNICALL Java_nativelibs_Affinity_getCores(JNIEnv *env, jclass type) {    return getCores();}JNIEXPORT void JNICALL Java_nativelibs_Affinity_bindToCpu(JNIEnv *env, jclass type, jint cpu) {    int cores = getCores();    LOGD("get cpu number = %d\n",cores);    if (cpu >= cores) {        LOGE("your set cpu is beyond the cores,exit...");        return;    }    cpu_set_t mask;    CPU_ZERO(&mask);    CPU_SET(cpu,&mask);    set_cur_thread_affinity((int)(&mask));    LOGD("set affinity to %d success",cpu);}


更多相关文章

  1. ReactNative调用原生封装的代码和控件
  2. Android开发人员不得不收集的代码(持续更新中)
  3. Android清除本地数据缓存代码
  4. android的多线程操作(一)
  5. Android 代码执行Linux Shell小记
  6. android studio中xml文件代码提示问题

随机推荐

  1. Android 添加快捷方式
  2. Android适用于IM通知音频的Vibrator
  3. Android(安卓)studio 点击按钮跳转到新的
  4. android 与其他程序交互(一)
  5. android 对软键盘的显示和消失监听
  6. 安装android studio 不能启动
  7. android图片上传springMvc
  8. TextInputLayout,让输入框更有灵性
  9. android kill package
  10. Android 常用的SDCARD和内存操作