gpt4 book ai didi

c++ - 如何在 JNI 中为 C++ 创建的新线程继续调用 java 实例 jobject

转载 作者:搜寻专家 更新时间:2023-10-31 01:39:31 25 4
gpt4 key购买 nike

如您所知,在 JNI 本地方法实现中,该函数将调用者实例 jobject 作为参数。但是,如果我全局保存此 jobject,并尝试在单独的线程中将 env->CallVoidMethod 与此 jobject 实例一起使用,则返回的方法始终为 NULL。我怀疑 C++ 线程不能使用这个调用者 jobject 实例,就像它们不附加时不能使用 JNIenv 实例一样。这个问题有解决办法吗?这是代码:

JNIEXPORT void JNICALL Java_test
(JNIEnv *env, jobject this_object, jshort server_port)
{
this_instance = new jobject();
*this_instance = thisObject;
Test test();
}

class Test
{
Test()
{
new boost::thread([]() {
JNIEnv *env_ = get_env();
jclass try_class = env_->GetObjectClass(*this_instance);

jmethodID on_subscription_request_id_try =
env_->GetMethodID(try_class, "onSubscriptionRequest", "(Ljava/lang/String;Ljava/lang/String;)Z");

char *k = new char[2];
k[0] = 'a';
k[1] = '\0';
jstring trip_id = env->NewStringUTF(k);
jstring token = env->NewStringUTF(k);
bool can_subscribe = env_->CallBooleanMethod(*this_instance, on_subscription_request_id, k, k);

})
}
}

我尝试直接在函数 Java_test 中使用 this_object 直接运行类测试构造函数中的代码,一切正常。但是当我在一个单独的线程中运行它时,我得到了一个段错误当 env_->CallBooleanMethod 被触发时。我怎么解决这个问题?谢谢。

注意:get_env 是我编写的一种附加线程并返回和环境的方法。它适用于所有其他情况,例如使用 NewStringUTF。这是代码:

JNIEnv * get_env()
{
JNIEnv *env;
jint result = jvm->GetEnv((void **)&env, JNI_VERSION_1_8);
if (result != JNI_OK)
{
jvm->AttachCurrentThread((void **)&env, NULL);
}
return env;
}

最佳答案

原来在 JNIenv 中有一个名为 NewGlobalRef 的方法,它接收一个 jobject 以返回一个全局引用。如果不这样做,将销毁已实现的 native 方法(如 jstring、jobject)的每个输入。您不能简单地将它传递到线程中,因为内存会在 native 方法结束时丢失。

关于c++ - 如何在 JNI 中为 C++ 创建的新线程继续调用 java 实例 jobject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31134009/

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