当我尝试创建对象的实例时,我得到IllegalMonitorStateException
。代码如下所示:
public int signIn(parameters...)
{
...check some stuff...
new Thread(... just a simple log here...).start();//IllegalMonitorStateException
return result;
}
更多信息:
实际应用程序包含2个通过JNI进行交互的程序(C ++和Java)。我遇到异常的情况如下。
我应该注意,此异常只发生在这种特殊情况下,如果我在连接成功后的某个时间调用login,一切正常。
我尝试了什么:
修改
这是堆栈跟踪:
Phoenix.client.ClientAPI.NativeInterface.NativeAPIEventListener.onConnectingFinished(母语 方法) Phoenix.client.ClientAPI.NativeInterface.NativeAPIEventListener.access $ 000(NativeAPIEventListener.java:12) Phoenix.client.ClientAPI.NativeInterface.NativeAPIEventListener $ 1.run(NativeAPIEventListener.java:30) java.lang.Thread.run(未知来源)
答案 0 :(得分:1)
我在C ++代码中创建了一个新线程,当java代码重新调用它时,这会将jthread:java -> c++ -> java
链分成jthread:java -> c++
和cthread:c++ -> java
。这解决了我面临的问题。但是我遇到了一个不同的问题,导致我阅读了一些JNI文档。引用JNI doc:
JNI接口指针(JNIEnv)仅在当前有效 线。 如果另一个线程需要访问Java VM,它必须 首先调用AttachCurrentThread()将自身附加到VM并获取 JNI接口指针。一旦附加到VM,就是本机线程 就像在本机中运行的普通Java线程一样工作 方法。本机线程保持连接到VM,直到它调用 DetachCurrentThread()分离自己。
所以我想我应该在回调java之前调用AttachCurrentThread
。但是这并不完全适合上面的描述,因为线程不是本机线程(它是最初在java代码中创建的线程,之后我可以调用DetachCurrentThread
吗?)。我没有测试这个解决方案,因为我不得不创建一个新的线程其他原因。但如果我有机会尝试这一点,我会确认。