我有一个简单的 Java 类:
public class MyClass
{
public static void dummyTest()
{
}
}
在 C++ 中,我执行以下 JNI 调用:
void c_call_function()
{
JNIEnv *env ...// the JNIEnv initialization in JNI...
jclass clazz ...// the class initialization in JNI...
jmethodID mid_dummyTest = env->GetStaticMethodID(clazz, "dummyTest", "()V");
env->CallStaticIntMethod(clazz, mid_dummyTest);
}
如果单个程序调用静态方法c_call_function() 没问题。
但是如果一个多线程程序调用 c_call_function(),当通过 env->CallStaticIntMethod(clazz, mid_dummyTest); 时,它会给我以下消息:
0x000000006FC77154 处的访问冲突读取到 0x0000000000000000
如果程序是多线程的,它使用相同的 JNIEnv 变量。 但我也尝试通过 AttachCurrentThread 方法加载相同的 JNIEnv,它给了我同样的问题。
只要不创建任何本地引用,甚至不删除或修改任何内容,多线程调用下面的方法有什么限制?
env->CallStaticIntMethod(clazz, mid_dummyTest);
最佳答案
env 应该为每个线程单独获取。当且仅当线程不是由 JVM 启动时,您才应该使用 AttachCurrentThread()。对于发出 AttachCurrentThread() 的每个线程,您必须调用 DetachCurrentThread()。
clazz 应该为每个线程单独获取,或者您可以保存对从 FindClass() 收到的结果的全局引用。
mid_dummyTest 可以保存在全局变量中:这个 id 独立于线程、env 和 clazz。
关于java - C++多线程Java JNI方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43682803/