【发布时间】:2014-10-21 11:31:52
【问题描述】:
我了解到,每次使用JNIEnv 时,我都必须使用jvm->AttachCurrentThread 将c 线程附加到jvm。这应该和互斥锁非常相似,我在方法的开头用jvm->AttachCurrentThread 锁定它,在最后用jvm->DetachCurrentThread() 解锁它。
所以,现在我有了一个更经常使用JNIEnv 的方法。我必须每次都打电话给AttachCurrentThread吗?这里有一个代码示例:
std::unique_ptr<IState> JNIGame::createEmptyState() {
JNIEnv* env;
jvm->AttachCurrentThread((void**)&env, NULL);
if(!jGame_createEmptyState)
jGame_createEmptyState = env->GetMethodID(jGameC, "createEmptyState", "()Ljni/JNIGames$IJNIState;");
JNIState *state = new JNIState();
//needed?
jvm->AttachCurrentThread((void**)&env, NULL);
state->jStateO = env->CallObjectMethod(jGameO, jGame_createEmptyState);
jvm->DetachCurrentThread();
return std::unique_ptr<IState>(state);
}
如您所见,我附加了两次线程,因为没有第二次,代码会崩溃。但如果它们像互斥体一样,则只需要第一个。你能帮我吗,为什么我每次都需要它们?是不是像现在的代码一样保存?
【问题讨论】:
标签: java c++ c multithreading java-native-interface