java - C++多线程Java JNI方法调用

标签 java c++ multithreading java-native-interface

我有一个简单的 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 独立于线程、envclazz

关于java - C++多线程Java JNI方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43682803/

相关文章:

c++ - 将整数转换为字符数组函数

c++ - 存储对象的底层类型是否不好?

c# - 为什么 Interlocked.Exchange 不支持 Boolean 类型?

python - 如何同时运行多个功能?

java - 访问请求范围的 bean

java - 日志文件已创建但文件为空

java - openfire smack 库

java - 包含两个变量的列表

c++ - 如何使用 OpenCV 从图像中获取调色板

c++ - C++中唯一锁、互斥量和条件变量的关系