使用JNI异步调用Java方法

使用JNI异步调用Java方法,java,c++,java-native-interface,Java,C++,Java Native Interface,我一直在努力熟悉JNI及其功能。我试图弄清楚我如何能够保持对Java环境的引用。我首先调用存储从jobject创建“NewGlobalRef”的本机方法,它可以正常工作一段时间。但我突然收到致命错误和日志。我很确定垃圾收集器会删除一些东西,即使我一直在两边引用对象 我现在做的是这个 我称之为本机方法 myCoolObject.nativeMethod(otherCoolObject); 我一直在java端引用otherCoolObject。本机方法所做的是 JNIEXPORT void JNI

我一直在努力熟悉JNI及其功能。我试图弄清楚我如何能够保持对Java环境的引用。我首先调用存储从jobject创建“NewGlobalRef”的本机方法,它可以正常工作一段时间。但我突然收到致命错误和日志。我很确定垃圾收集器会删除一些东西,即使我一直在两边引用对象

我现在做的是这个

我称之为本机方法

myCoolObject.nativeMethod(otherCoolObject);
我一直在java端引用otherCoolObject。本机方法所做的是

JNIEXPORT void JNICALL Java_HelloWorld_nativeMethod(JNIEnv *env, jobject obj , jobject otherCoolObject) {
    cout << "Called native method!" << endl;
    coolObj = env->NewGlobalRef(otherCoolObject);
    clazz = (*env).GetObjectClass(coolObj;
    callbackEnv = env;
    methodId = (*env).GetMethodID(clazz, "callback", "(II)V");
    jint x = 1;
    jint y = 2;
    (*callbackEnv).CallVoidMethod(coolObj, methodId, x, y);
}
JNIEXPORT void JNICALL Java\u HelloWorld\u nativeMethod(JNIEnv*env、jobject obj、jobject otherCoolObject){

cout您不能重用JNIenv,因为它特定于创建它的函数(线程、范围和所有)。 为了获得从回调调用java方法的有效JNIenv,您必须 使用JNI_GetCreatedJavaVMs()和AttachCurrentThread()

更多信息请点击此处:

您不能重用JNIenv,因为它特定于创建它的函数(线程、范围和所有)。 为了获得从回调调用java方法的有效JNIenv,您必须 使用JNI_GetCreatedJavaVMs()和AttachCurrentThread()

更多信息请点击此处:

如果我尝试使用JNI\u GetCreatedJavaVMs(),我只会得到“未定义的对`\u imp\u JNI的引用”_GetCreatedJavaVMs@12“上面的错误代码发现这个线程可能很有用:在我创建全局引用后,它开始工作,但过了一段时间,它会产生新的致命错误。你是最好的!在玩了第二次之后,它开始工作了。”(我不太擅长C语言:<)如果我尝试使用JNI\u GetCreatedJavaVMs(),我只会得到“对`\u imp\u JNI的未定义引用”_GetCreatedJavaVMs@12'"上面的错误代码发现这个线程可能很有用:在我创建了全局引用之后,它开始工作,但是过了一段时间,它会产生新的致命错误。你是最好的!在第二次使用它之后,它开始工作了(我对C语言不太熟悉:<)我是jni新手,使用callbackEnv的目的是什么?我们不能继续使用(*env).CallVoidMethod吗(coolObj,methodId,x,y);?我是jni新手,使用callbackEnv的目的是什么?我们不能继续使用(*env)。CallVoidMethod(coolObj,methodId,x,y)??