Вызов методов Java асинхронно с использованием JNI - PullRequest
0 голосов
/ 03 апреля 2012

Я пытался познакомиться с JNI и его функциональностью. Я пытаюсь понять, как я могу сохранить ссылку на среду Java. Сначала я вызываю нативный метод, который store создает «NewGlobalRef» из рабочего места, и он некоторое время работает нормально. Но потом вдруг я получаю фатальную ошибку и лог. Я почти уверен, что сборщик мусора удаляет что-то, даже если я постоянно держу ссылку на объект с обеих сторон.

Что я делаю в банкомате, это

я вызываю нативный метод

myCoolObject.nativeMethod(otherCoolObject);

Я все время держу ссылку на otherCoolObject на стороне Java. То, что делает нативный метод, это

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 Ответ

3 голосов
/ 03 апреля 2012

Вы не можете повторно использовать ваш JNIenv, потому что он специфичен для функции, которая его создала (это поток, область действия и все).для получения действительного JNIenv для вызова java-метода из вашего обратного вызова вы должны использовать JNI_GetCreatedJavaVMs () и AttachCurrentThread ()

дополнительную информацию здесь: http://docs.oracle.com/javase/1.3/docs/guide/jni/spec/invocation.doc.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...