2

我想创建一个 Java 程序来侦听和响应 C 中线程捕获的事件。
有人可以解释如何使用 JNI 实现这一点,或者指向在线教程吗?

谢谢你。

4

2 回答 2

2

您可以让本机代码调用 Java 方法来接收事件。有几篇关于 JNI 的文章可以帮助您,例如How to Call Java functions from C Using JNI

于 2009-01-17T18:38:50.163 回答
2

如果您想进行任何类型的 JNI 编程,则需要阅读JNI规范。

从 C 调用 Java 代码有两种情况。在第一种情况下,Java 程序调用本地方法,将控制权传递给 C。C 函数接收一个指针作为其第一个参数,该JNIEnv指针是用于访问 JNI 的主句柄。从 Java 到 C 的典型调用如下所示:

jenv->CallStaticMethod(jenv, cls, ...);

(请注意,在 C++ 中,调用是正确的方法,因此您不需要jenv作为第一个参数传递。)这相当简单;Java 调用 C 调用回 Java。

第二种情况稍微复杂一些,当您有需要对 Java 进行“自发”调用的 C 代码时必须使用第二种情况,即不是因为该代码首先从 Java 调用的结果。这通常是您有一个本机线程生成事件的情况(如您的情况)。然后,您需要使用称为Invocation API的 JNI 的一部分。此 API 分两步使用:首先您请求对要调用的 JVM 的引用(一些 JVM 实现支持同一进程中的多个 JVM),第二步是请求JNIEnv指针以便调用 JVM .

为了获得JNIEnv指向 JVM 的调用的指针,本机线程需要将自身“附加”到 JVM。这样做是为了让 JVM “感知”线程,并且在将线程附加到 JVM 之后,该线程可以被认为是任何其他 Java 线程(实际上,我不确定是否有任何实际差异)。如果您在调试器中检查 JVM 的线程,本机线程将显示为任何其他线程。请注意,您可以将本机线程标记为守护线程,因此当 JVM 退出时,该线程将被杀死。

但是请注意,在 Unix 信号处理程序中执行操作时需要采取适当的预防措施。我建议不要直接从信号处理程序调用 Java。

于 2009-01-19T20:44:47.563 回答