从 C/C++ 代码通知 java 对象



我想知道是否可以用本机代码通知(notify())java对象?

例如,假设我们在 java 中有一个线程正在等待如下信号。

void _do_something() throws Exception{
   synchronized(__lock_){
      __lock_.wait();
   }
}

那么是否可以从本机代码通知__lock_对象?!我应该将__lock_对象传递给 c 代码吗?那么 C 代码如何以及如何调用 notify() 方法。任何帮助,不胜感激。提前谢谢。

这在本机代码中非常可行。不过,您需要使用 JNI

...

那么是否可以从本机代码通知 _lock 对象?!

当然,只要您的本机代码具有 _lock 对象的句柄,您所要做的就是同步并对其调用通知(就像从本机代码调用任何其他 java 对象一样)。

我应该将 _lock 对象传递给 c 代码吗?

是的。既是因为当你调用 CallVoidMethod() JNI 函数来调用 notify() 时需要它,也是因为你需要进入/退出该对象的监视器(JNI 等效的说法是"syncd(_lock)"

那么 C 代码如何以及如何调用 notify() 方法

首先,您需要了解将本机代码映射到可以从 Java 调用的内容的基础知识。然后,您需要了解如何从本机代码回调到java中,当您理解这一点时,只需学习如何使用MonitorEnter,CallVoidMethod和MonitorExit即可。

不幸的是,JNI有时似乎是为了让人们远离而设计的。当你不熟悉它时,很难进行适当的调试。我建议从小处着手掌握它,然后等待真正的东西,直到你了解基础知识。

我对 JNI 的最佳建议是遵守规则(至少在开始时),在每次调用后检查异常(并在获得它们时将它们转储到 stderr 或其他东西)并使用 -Xcheck:jni 运行您的 java。周围有很多教程,当我用谷歌搜索时,我在前 10 名列表中找到了这个教程,似乎还可以。

祝你好运!

最新更新