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

4 c c++ java java-native-interface multithreading

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

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

void _do_something() throws Exception{
   synchronized(__lock_){
      __lock_.wait();
   }
}
Run Code Online (Sandbox Code Playgroud)

那么是否可以__lock_从本机代码通知对象?!我应该将__lock_对象传递给c代码吗?那么C代码如何以及如何调用该notify()方法.任何帮助表示赞赏.提前致谢.

Fre*_*rik 6

这在本机代码中是非常可行的.你需要使用JNI ......

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

当然,只要您的本机代码具有_ lock对象的句柄,您所要做的就是同步并在其上调用notify(就像您从本机代码调用任何其他java对象一样).

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

是.两者都是因为当你调用CallVoidMethod()JNI函数调用notify()时你需要它,还因为你需要输入/退出该对象的Monitor(JNI等效的方式说"synchronized(_ lock)"

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

首先,您需要了解将本机代码映射到可以从java调用的内容的基础知识.然后你需要了解如何从该本机代码回调到java,当你理解这一点时,学习如何使用MonitorEnter,CallVoidMethod和MonitorExit都是一个问题.

不幸的是,JNI有时似乎是为了让人们远离.当你刚接触它时,很难进行适当的调试.我建议从小处着手抓住它并等待真实的东西直到你理解基础知识.

我对JNI的最好建议是遵守规则(至少在开始时),在每次调用后检查异常(并在获取它们时将它们转储到stderr或其他东西)并使用-Xcheck:jni运行java.有很多教程,当我用Google搜索时,我发现这一个在top10列表中,似乎没问题.

祝好运!