我想知道是否可以通过本机代码通知(notify()
)一个java对象?
例如,假设我们在java中有一个等待信号的线程,如下所示。
void _do_something() throws Exception{
synchronized(__lock_){
__lock_.wait();
}
}
那么是否可以从本机代码通知__lock_
对象?!
我应该将__lock_
对象传递给c代码吗?那么C代码如何以及如何调用notify()
方法。
任何帮助表示赞赏。
提前谢谢。
答案 0 :(得分:6)
本机代码非常可行。你需要使用JNI ......
那么是否可以从本机代码通知_ lock 对象?!
当然,只要您的本机代码具有_ lock 对象的句柄,您所要做的就是同步并在其上调用notify(就像您从中调用任何其他java对象一样)本地代码)。
我应该将_ lock 对象传递给c代码吗?
是。两者都是因为当你调用CallVoidMethod()JNI函数来调用notify()时你需要它,还因为你需要进入/退出该对象的监视器(JNI等效的说法" synchronized(_ lock) )"
那么C代码如何以及如何调用notify()方法
首先,您需要了解将本机代码映射到可以从java调用的内容的基础知识。然后你需要了解如何从该本机代码回调到java,当你理解这一点时,学习如何使用MonitorEnter,CallVoidMethod和MonitorExit都是一个问题。
不幸的是,JNI有时似乎是为了让人们远离。如果你对它不熟悉,那么进行适当的调试就很困难了。我建议从小处着手抓住它并等待真实的东西直到你理解基础知识。
我对JNI的最好建议是遵守规则(至少在开始时),在每次调用后检查异常(并在获得它们时将它们转储到stderr或其他东西)并使用-Xcheck:jni运行java。 周围有很多教程,当我用Google搜索时,我在top10列表中找到this one,似乎没问题。
祝你好运!