我想知道是否可以用本机代码通知(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 名列表中找到了这个教程,似乎还可以。
祝你好运!