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])); }