Android NDK JNI C++ <14> 向pthread传递参数

弄了半天,一直参数不能够传递成功,按照晚上的方法,也不能成功,后来无意中加了一个sleep(2),让其停顿一下,就可以了,我个人的分析结果是这样的: 主线程创建线程后,就直接结束了自己,结果主线程里面的初始变量和数据也随之释放了,结果在创建线程中不能够得到主线程传递过来的值(因为已经随主线程release了),下面的demo是在前一篇文章的基础上做了进一步修改的.

步骤如下:昨天已经有的不重复了.

<1> : 先传递单个变量的方式:我们在昨天那个main_pThread()函数中添加:

int m=123;

    pthread_create(&t, NULL, &fun_in_threads, (void*)&m);


<2> : 注意我在fun_in_threads后面函数名多加了一个s,作为区分fun_in_thread函数的.

/*
 * transfer single parameters to thread
 * */
void* fun_in_threads(void* args){

    int i=*(int *)args;

    LOGI("simple parameters is : %d",i);


}


<3> : 如果单独添加上面的,可能永远得不到传递的值,原因可能是我开头分析的,所以要在main_pThread()中添加:头文件:#include <unistd.h>

sleep(1);

让主调函数稍微停顿,或者加一个for循环,sleep中是s为单位的.

<4> : 如果要传递多个参数,一般是通过结构体的方式:

struct thread_para {
    int age;
    int scores;
};

创建线程:main_pThread函数中添加:

pthread_t pt[NUMT];
    pthread_t t;
    struct thread_para t_paras;
            t_paras.age=99;
            t_paras.scores=100;

 

for (i = 0; i < NUMT; i++) {
        pthread_create(&pt[i], NULL, &fun_in_thread, (void *)&t_paras);
        sleep(1);
    }

子线程的函数:

/*
 * transfer a struct to thread
 *
 * */
void* fun_in_thread(void* arg) {
    LOGI("enter in fun_in_thread !");
    /*int *i=arg;
    LOGI("thread parameters : %d",*i);*/
    struct thread_para *pars;
    pars=(struct thread_para*)arg;

    if(pars->age==99){
        LOGI("pars' age is 99 ! %d",pars->scores);
    }else{
        LOGI("pars' age is not 99 ! %d",pars->age);
    }

    return (void *)123;

}

<5> : 运行结果如下

 

 

<6> : 整个cpp文件内容如下:

#include <jni.h>
#include <android/log.h>
#include <pthread.h>
#include <unistd.h>
#include "onload.h"

#define TAG "jni_thread"

#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO,TAG,__VA_ARGS__))
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN,TAG,__VA_ARGS__))
#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR,TAG,__VA_ARGS__))
#define NUMT 5
#define JAVA_CLASS_PATH "org/pthreadClass"
namespace android {

struct thread_para {
    int age;
    int scores;
};
void native_init() {

    LOGI("native init .");

}
/*
 * transfer a struct to thread
 *
 * */
void* fun_in_thread(void* arg) {
    LOGI("enter in fun_in_thread !");
    /*int *i=arg;
    LOGI("thread parameters : %d",*i);*/
    struct thread_para *pars;
    pars=(struct thread_para*)arg;

    if(pars->age==99){
        LOGI("pars' age is 99 ! %d",pars->scores);
    }else{
        LOGI("pars' age is not 99 ! %d",pars->age);
    }

    return (void *)123;

}
/*
 * transfer single parameters to thread
 * */
void* fun_in_threads(void* args){

    int i=*(int *)args;

    LOGI("simple parameters is : %d",i);


}

void main_pThread() {
    LOGI("MAIN THREAD");

    pthread_t pt[NUMT];
    pthread_t t;
    struct thread_para t_paras;
            t_paras.age=99;
            t_paras.scores=100;
    int i;
    int m=123;

    pthread_create(&t, NULL, &fun_in_threads, (void*)&m);

    for (i = 0; i < NUMT; i++) {
        pthread_create(&pt[i], NULL, &fun_in_thread, (void *)&t_paras);
        sleep(1);
    }
}

}

using namespace android;

JNINativeMethod mNativeMethods[] = {
        { "nativeinit", "()V", (void*) native_init }, { "mainthread", "()V",
                (void*) main_pThread } };

int register_android_pthread_jni_demo(JNIEnv* env) {

    return jniRegisterNativeMethods(env, JAVA_CLASS_PATH, mNativeMethods,
            sizeof(mNativeMethods) / sizeof(mNativeMethods[0]));

}

 

 

 

 

 

 

 

posted @ 2014-05-25 16:26  MMLoveMeMM  阅读(1021)  评论(0)    收藏  举报