【问题标题】:How to: Java listening for events captured by C thread如何:Java 侦听 C 线程捕获的事件
【发布时间】:2009-01-17 18:27:57
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: java c multithreading java-native-interface


    【解决方案1】:

    您可以让本机代码调用 Java 方法来接收事件。 JNI上有几篇文章可以帮到你,比如How to Call Java functions from C Using JNI

    【讨论】:

    • 嗨,David,如果本机代码要调用 Java 方法来接收事件,那么如何将控制权传递回主 Java 程序?必须只有一个 Java 程序实例持续监视和响应 C API 捕获的事件。请指教。谢谢。
    • 假设本机代码是您的应用程序的入口点,那么它将启动 JVM 并在您的 Java 程序中执行 main 方法。您可以让这个 main 方法启动一个单独的 Java 线程,该线程在后台运行并通过 C API 调用的方法接收事件。
    【解决方案2】:

    如果您想进行任何类型的 JNI 编程,则必须阅读 JNI specification

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

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

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

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

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

    但是请注意,在 Unix 信号处理程序中执行操作时需要使用 proper precautions。我建议不要直接从信号处理程序调用 Java。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-01
      • 2018-02-26
      • 1970-01-01
      • 1970-01-01
      • 2013-12-09
      • 2021-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多