假设:从Java调用C ++代码相对简单。据我所知,C ++代码在与调用它的Java代码相同的线程中执行(如果我错了,请纠正我)。如果C ++代码然后用pthread_key_create()
启动一个新的 native 线程,这个线程可以通过JNI回调到Java吗?如果是这样,这怎么可能,因为代码将在pthread而不是JVM上的Java线程中执行?
答案 0 :(得分:3)
据我了解,C ++代码在与调用它的Java代码相同的线程中执行(如果我错了,请纠正我)
JNIEnv
附加到一个线程,你不能在线程之间共享一个JNIEnv。您的本机函数都接收JNIEnv
作为第一个参数,因此它对应于当前Thread的JNIEnv
。
如果C ++代码然后用pthread_key_create()启动一个新的本机线程,这个线程可以通过JNI回调到Java吗?
所有线程都是Linux线程,由内核调度。它们通常从托管代码(使用Thread.start
)开始,但也可以在其他位置创建,然后附加到JavaVM
。例如,以pthread_create
开头的帖子可以附加JNI AttachCurrentThread
或AttachCurrentThreadAsDaemon
函数。在连接线程之前,它没有JNIEnv
,并且无法进行JNI调用。
如果是这样,这怎么可能,因为代码将在pthread而不是JVM上的Java线程中执行?
也参见之前的回复;)(前两句)
答案 1 :(得分:2)
看一下这个样本:
在此示例中,您有一个基于多线程的代码,可以调用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拨打电话,本机创建的线程应首先调用AttachCurrentThread或AttachCurrentThreadAsDaemon。