Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:Java线程如何对应于本机线程?_Android_Multithreading_Java Native Interface_Native - Fatal编程技术网

Android:Java线程如何对应于本机线程?

Android:Java线程如何对应于本机线程?,android,multithreading,java-native-interface,native,Android,Multithreading,Java Native Interface,Native,在Android中,如果我从不同的Java线程调用同一JNI库中的函数,那么JNI函数是在同一个本机线程上调用,还是在不同的本机线程中调用 所有Android版本的答案都一样吗 (如果调用需要在同一本机线程上初始化和调用的JNI库,我怀疑AsyncTask不是最佳选择。)关于本机代码,Java线程和本机线程之间没有区别,它们都只是一个线程。您不会通过从Java调用本机方法来更改线程,它将在与之前的Java代码相同的线程上执行 JavaVM为每个线程保存一些额外的信息,因此必须首先将在本机代码中创

在Android中,如果我从不同的Java线程调用同一JNI库中的函数,那么JNI函数是在同一个本机线程上调用,还是在不同的本机线程中调用

所有Android版本的答案都一样吗


(如果调用需要在同一本机线程上初始化和调用的JNI库,我怀疑
AsyncTask
不是最佳选择。)

关于本机代码,Java线程和本机线程之间没有区别,它们都只是一个线程。您不会通过从Java调用本机方法来更改线程,它将在与之前的Java代码相同的线程上执行

JavaVM为每个线程保存一些额外的信息,因此必须首先将在本机代码中创建的线程附加到VM

JNI规范的以下部分给出了一些提示:

创建虚拟机

函数的作用是:加载并初始化Java虚拟机,并返回指向JNI接口指针的指针。称为JNI_CreateJavaVM()的线程被认为是主线程

附加到虚拟机

JNI接口指针(JNIEnv)仅在当前线程中有效。如果另一个线程需要访问Java VM,它必须首先调用AttachCurrentThread()将自身连接到VM并获取JNI接口指针。一旦连接到VM,本机线程的工作方式与在本机方法中运行的普通Java线程类似。本机线程在调用DetachCurrentThread()以分离自身之前一直保持与VM的连接

附加的线程应该有足够的堆栈空间来执行合理的工作量。每个线程的堆栈空间分配是特定于操作系统的。例如,使用pthreads,可以在pthread_attr_t参数中为pthread_create指定堆栈大小

从虚拟机分离

连接到VM的本机线程必须在退出之前调用DetachCurrentThread()以分离自身。如果调用堆栈上存在Java方法,则线程无法自行分离


我对JNI知之甚少,但在我看来,首先要做的是初始化,然后在seprate线程上调用你想要的任何东西。你能给文档提供一个链接,明确地说明这一点吗?(或者是一些实用知识?@18446744073709551615我添加了一些来自JNI规范(Java6)的引用。