使用jni时将第三方线程附加到vm

时间:2012-04-06 01:20:40

标签: java c java-native-interface pthreads

我正在编写一个使用c编写的硬件驱动程序的Java程序。这个硬件驱动程序启动一个回调线程,你可以注册回调函数,以便在发生事件时调用。如何将此线程附加到jvm,以便它可以为这些回调调用Java方法?我只有从start_callbacks()函数返回的线程id,作为int返回,但它是在pthread_create()调用中使用的pthread_t。

我发现的一种方法是在每个回调函数的开头使用pthread_once并在那里附加线程。但是之后就没有办法解决它了。我尝试使用pthread_cleanup_push / pop,但是它们需要作为一对调用,因此无效。

在我看来,我唯一能做到这一点的选择是在每次回调调用时附加和分离线程。或者稍微改写一下驱动程序,我真的不想这样做。

我错过了什么吗?

2 个答案:

答案 0 :(得分:2)

这正是JNI称之为AttachCurrentThread()DetachCurrentThread()的目的。

答案 1 :(得分:0)

可以使用thread_local存储(C ++ 11和更高版本)解决问题的解决方案。这样,您可以连接到任意线程,然后在该线程存在时自动分离(即使您没有创建线程并且无法控制其生命周期)。

在我的答案中可以找到有关如何在C ++中实现的示例示例: https://stackoverflow.com/a/59934966/8367574