使用JNI异步调用Java方法

时间:2012-04-03 14:16:18

标签: java c++ java-native-interface

我一直在努力熟悉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);
}

我可以在此之后调用该方法一段时间,但突然间它给了我致命错误我告诉过你

1 个答案:

答案 0 :(得分:3)

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

此处提供更多信息: http://docs.oracle.com/javase/1.3/docs/guide/jni/spec/invocation.doc.html