Android NDK c创建新的线程

独自空忆成欢 提交于 2020-03-14 20:17:21

在jni的c/c++层创建一个新的线程只需要3步:

1.导入库

#include<pthread.h>

2.写好线程要做的事

void* run_1(void*);

void* run_1(void* args){

...

}

3.调用方法

pthread_t thread_1;

pthread_create(&thread_1,NULL,run_1,args);

///////////////////////////////////////////////////////////////////////////////////

但是这样的线程,缺少了JNIEnv指针,好像干不了什么事,所以就要做这个基础上,得到JNIEnv指针,并将该线程依附于java虚拟机之上,这样这个线程像java层过来的线程一样,能够干很多事情。

官方文档关于attachCurrentThread()的说明,好像勉强看得懂,就翻译一下试试。。。

The JNI interface pointer (JNIEnv) is valid only in the current thread. Should another thread need to access the Java VM, it must first call AttachCurrentThread() to attach itself to the VM and obtain a JNI interface pointer. Once attached to the VM, a native thread works just like an ordinary Java thread running inside a native method. The native thread remains attached to the VM until it calls DetachCurrentThread() to detach itself.

The attached thread should have enough stack space to perform a reasonable amount of work. The allocation of stack space per thread is operating system-specific. For example, using pthreads, the stack size can be specified in thepthread_attr_t argument to pthread_create.

JNI接口的JNIEnv指针只是在当前线程是有效的(意思是不同的线程不能共用一个JNIEnv*)。其他的线程要访问虚拟机的时候,他就必须通过调用AttachCurrentThread()方法来让当前线程与虚拟机建立某种关系,然后得到一个指针,也就是JNIEnv*。这个线程一旦与了虚拟机建立了某种关系,这个本地(由c/c++代码创建)的线程就能够像一个通常的java线程一样在c/c++层执行了。这种关系一直保持着,直到他调用了DetachCurrentThread()方法来解除关系。
这个与vm保持着某种关系的线程必须要保证有足够的栈空间来执行各种工作。每个线程所能分配的栈空间大小是有明确规定的。举个例子,使用了pthreads,栈的大小就应该是在pthread_create方法调用时传入的pthread_attr_t参数(第二个参数)的大小之内。(这里正好说明了以上方法的第二个参数是干嘛的,null估计就默认分配了)
 

例子代码见原帖.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!