我正在尝试创建一个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
?
暂无答案!
目前还没有任何答案,快来回答吧!