当前位置: 首页 > 知识库问答 >
问题:

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

斜光耀
2023-03-14

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

我发现的一种方法是在每个回调函数的开头使用pthread_一次,并将线程附加到那里。但是没有办法把它拆开。我试着使用pthread_cleanup_push/pop,但它们需要成对调用,所以无法工作。

在我看来,我唯一正确的选择就是在每次回调调用时连接和分离线程。或者重写驱动程序,我真的不想这么做。

我错过了什么吗?

共有2个答案

阚正真
2023-03-14

您的问题的解决方案可以通过线程_本地存储(C 11及更高版本)来解决。这允许您附加到任意线程,然后当该线程存在时,它将自动分离(即使您没有创建该线程,也无法控制其生命周期)。

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

邢修明
2023-03-14

这正是JNI调用的AttachCurrentThread()DetachCurrentThread()的目的。

 类似资料:
  • 问题内容: 您可以使用Eclipse附加到正在运行的应用程序,类似于使用Visual Studio附加方式吗? 问题答案: 是。 如果在打开调试端口的情况下启动服务器,请将其添加到java命令中: 并且您的项目中有源代码(从技术上讲这不是必需的,但是除非您这样做,否则它是无用的),您可以通过使用host =服务器所在的机器设置“调试配置”来连接到正在运行的服务器在端口= 8888上运行(例如-参见

  • 附录 D. 第三方工具 Subversion的模块设计(在“分层的库设计”一节讨论过)和语言绑定的能力(在“使用 C 和 C++ 以外的语言”一节描述过)使的我们可以作为扩展和后端支持来替代软件的某些部分,在这个附录里,我们会简略介绍一些使用Subversion功能的第三方的工具。关于更新的信息,可以在Subversion的网站(http://subversion.tigris.org/proje

  • 问题内容: 我有一个从C调用的Java函数的JNI包装器。我试图从不同的线程调用某些方法,并且在尝试获取JNIEnv指针的新副本时收到错误消息。下面使用m并在每种方法中调用它: 从主线程/初始线程调用JVM时,该JVM已被实例化,并且该(和其他方法)运行。当我获得envRes的值时,在子线程中它保持-2。 问题答案: 请参阅本章的文档。 在使用任何JNI函数之前,您至少需要为每个本机线程调用一次。

  • 问题内容: 我想建立一个不牺牲SEO的ajax网站。我的问题是:如果我的页面上有这样的链接: …当单击每个链接时,我想用相应的标签更新地址栏。因此,如果单击“猫”链接,则当前位置为http://example.com/#cats,我可以用它来显示我的Ajax内容。如果javascript关闭或用户是搜索引擎,他们将直接转到/ cats 问题答案: 您可以更改属性,它会更改当前的锚标识符,而无需导航

  • 这是一个独立的多线程核心java应用程序,它使用httpclient-4.0-beta1.jar进行连接。 当尝试连接到客户端url时出现以下异常,我需要发送请求。 我使用下面的配置通过shell脚本运行这个,一开始我尝试用代理执行,但之后我也配置了代理,但仍然存在同样的问题。任何在thsi方面的帮助都将非常感谢。

  • 我们是否可以将Azure Applications Insight dashboard嵌入到我们的一个第三方站点中,以允许我们的客户查看它提供的信息? 我还知道,使用API手动构建这些仪表板是可能的,但是,简单地获取Azure门户中创建的度量图的嵌入式代码会更好。 有人能做到吗?