可以从本机代码调度的pthread回调到JNI吗?

时间:2017-07-10 15:38:23

标签: java c++ multithreading java-native-interface pthreads

假设:从Java调用C ++代码相对简单。据我所知,C ++代码在与调用它的Java代码相同的线程中执行(如果我错了,请纠正我)。如果C ++代码然后用pthread_key_create()启动一个新的 native 线程,这个线程可以通过JNI回调到Java吗?如果是这样,这怎么可能,因为代码将在pthread而不是JVM上的Java线程中执行?

3 个答案:

答案 0 :(得分:3)

  

据我了解,C ++代码在与调用它的Java代码相同的线程中执行(如果我错了,请纠正我)

JNIEnv附加到一个线程,你不能在线程之间共享一个JNIEnv。您的本机函数都接收JNIEnv作为第一个参数,因此它对应于当前Thread的JNIEnv

  

如果C ++代码然后用pthread_key_create()启动一个新的本机线程,这个线程可以通过JNI回调到Java吗?

所有线程都是Linux线程,由内核调度。它们通常从托管代码(使用Thread.start)开始,但也可以在其他位置创建,然后附加到JavaVM。例如,以pthread_create开头的帖子可以附加JNI AttachCurrentThreadAttachCurrentThreadAsDaemon函数。在连接线程之前,它没有JNIEnv,并且无法进行JNI调用。

  

如果是这样,这怎么可能,因为代码将在pthread而不是JVM上的Java线程中执行?

也参见之前的回复;)(前两句)

更多信息herehere

答案 1 :(得分:2)

看一下这个样本:

enter image description here

在此示例中,您有一个基于多线程的代码,可以调用Java代码。

您可以在此处找到完整说明:http://jnicookbook.owsiak.org/recipe-no-027/

源代码可在此处获取:

https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo027

我不会把所有代码放在这里,因为它需要一些空间。

事实上,在这里:https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo032, 你有更适合你的样品。其中JVM调用C调用JVM,在Main类中调用静态方法。

> java -Djava.library.path=${LD_LIBRARY_PATH}:./lib -cp target recipeNo032.Main
I will call JVM
From JVM
I will call JVM
From JVM
I will call JVM
From JVM
I will call JVM
From JVM
I will call JVM
From JVM
I will call JVM
From JVM

与JNI玩得开心。

答案 2 :(得分:1)

为了向Java拨打电话,本机创建的线程应首先调用AttachCurrentThreadAttachCurrentThreadAsDaemon