4

I am wondering is it possible to notify( notify() ) a java object with native code?

For example let's say we have a thread in java which is waiting for a signal as below.

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

Then is it possible to notify the __lock_ object from a native code?! Should I pass the __lock_ object to the c code? so how and how C code call the notify() method. Any help is appreciated. Thanks in advance.

4

1 回答 1

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-list 中,看起来还可以。

祝你好运!

于 2013-10-18T19:27:27.347 回答