GetEnv(&envThread, JNI_VERSION_1_6) 获取多个线程的“env”,以便创建多个 envThread->GetMethodID()电话。两个线程都正-6ren">
gpt4 book ai didi

android - 为什么 Android jvm->GetEnv() 会为多个线程返回相同的 "env"。?

转载 作者:搜寻专家 更新时间:2023-10-31 02:20:43 24 4
gpt4 key购买 nike

我正在使用 jvm->GetEnv(&envThread, JNI_VERSION_1_6) 获取多个线程的“env”,以便创建多个 envThread->GetMethodID()电话。两个线程都正确附加到 JVM。

我在第一个线程上调用“GetMethodID()”返回的函数没有问题,但是当第二个线程尝试调用时,我看到了这条消息:

art/runtime/check_jni.cc:65] JNI DETECTED ERROR IN APPLICATION: thread Thread[13,tid=8207,Native,Thread*=0xaed08400,peer=0x12dcd080,"Thread-10224"]
using JNIEnv* from thread Thread[1,tid=8148,Runnable,Thread*=0xb4e07800,peer=0x87bc5ef0,"main"]

A/art(8148): art/runtime/check_jni.cc:65 in call to CallVoidMethodV
08-31 14:11:08.029: A/art(8148): art/runtime/check_jni.cc:65] "Thread-10224" prio=10 tid=13 Runnable
08-31 14:11:08.029: A/art(8148): art/runtime/check_jni.cc:65] group="main" sCount=0 dsCount=0 obj=0x12dcd080 self=0xaed08400
08-31 14:11:08.029: A/art(8148): art/runtime/check_jni.cc:65] sysTid=8207 nice=-11 cgrp=apps sched=0/0 handle=0xafb18b00
08-31 14:11:08.029: A/art(8148): art/runtime/check_jni.cc:65] state=R schedstat=( 17710887 6014947 64 ) utm=1 stm=0 core=3 HZ=100
08-31 14:11:08.029: A/art(8148): art/runtime/check_jni.cc:65] | stack=0xaee04000-0xaee06000 stackSize=1012KB

因为我对 jvm->getEnv() 的调用为第二个线程返回了 JNI_OK,所以它已经附加(如预期)。但没想到返回的 JniENV 与第一个线程返回的 JniENV 完全一样。从而导致崩溃。

有人见过这种东西吗?我完全不知道该怎么办...

谢谢。

最佳答案

我认为您应该使用来自其他线程的 AttachCurrentThread

这是一个 similar question所以:

void callback(int val) {
JNIEnv * g_env;
// double check it's all ok
int getEnvStat = g_vm->GetEnv((void **)&g_env, JNI_VERSION_1_6);
if (getEnvStat == JNI_EDETACHED) {
std::cout << "GetEnv: not attached" << std::endl;
if (g_vm->AttachCurrentThread((void **) &g_env, NULL) != 0) {
std::cout << "Failed to attach" << std::endl;
}
} else if (getEnvStat == JNI_OK) {
//
} else if (getEnvStat == JNI_EVERSION) {
std::cout << "GetEnv: version not supported" << std::endl;
}

g_env->CallVoidMethod(g_obj, g_mid, val);

if (g_env->ExceptionCheck()) {
g_env->ExceptionDescribe();
}

g_vm->DetachCurrentThread();
}

关于android - 为什么 Android jvm->GetEnv() 会为多个线程返回相同的 "env"。?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32320472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com