从jni方法中创建的c++回调调用java方法失败

pobjuy32  于 2021-07-12  发布在  Java
关注(0)|答案(0)|浏览(237)

我正在尝试创建一个c++回调函数,如果某个事件发生,它将被调用。如果是这样的话,回调应该调用java方法。
为了能够调用这个java方法,我需要访问jnienv对象,这就是为什么我在一个jni函数中设置所有东西,这个函数从java调用。
安排事情很简单。我获得了 jclass ,的 jmethodID 等。代码如下所示:

JNIEXPORT void JNICALL Java_my_customclass_register(JNIEnv* jenv, jobject obj, jlong nativePeerAddress, jstring callbackName)
{
  jclass customClass       = jenv->FindClass("<fully qualified class name>");
  const char* methodName   = jenv->GetStringUTFChars(callbackName, JNI_FALSE);
  jmethodID callbackMethod = jenv->GetMethodID(customClass, methodName, "()V");
  jenv->ReleaseStringUTFChars(callbackName, methodName);

  reinterpret_cast<CustomClass*>(nativePeerAddress)->SetCallback([jenv, obj, callbackMethod]()
  {
    jenv->CallVoidMethod(obj, callbackMethod);
  });
}

SetCallback call是设置作为回调的c++lambda的地方。回调本身最终会在事件发生后使用

jenv->CallVoidMethod(obj, callbackMethod);

我面临的问题是,这个调用发生在上面列出的jni方法终止很久之后。如果调用回调,我最终会收到以下错误消息:

JNI DETECTED ERROR IN APPLICATION: use of invalid jobject

如果我将这行代码移出c++回调并将其放在该行的正下方,则该调用会如预期的那样成功

jenv->ReleaseStringUTFChars(callbackName, methodName);

但是,当从c回调中执行时,它不起作用。我想问题是
jobject obj 不再是有效对象。我的假设是这样的,因为jni方法已经终止并处理了 jobject (c
Package 器,而不是java对象)。
但是,我不清楚如何获得有效的 jobject 我可以在上面执行 jmethodID . obj 会指向正确的java对象,但它不是这样工作的。
你知道我怎样才能得到一个有效的答案吗 jobject ?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题