java - 使用 JNI 异步调用 Java 方法

标签 java c++ java-native-interface

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

我在atm上做的是这个

我调用本地方法

myCoolObject.nativeMethod(otherCoolObject);

我一直在 java 端引用 otherCoolObject。 native方法的作用是

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);
}

我可以在这之后调用该方法一段时间,但突然间它给了我我告诉过你的 fatal error

最佳答案

您不能重用 JNIenv,因为它特定于创建它的函数(它是线程、作用域和所有)。 要获得有效的 JNIenv 以从您的回调中调用 Java 方法,您必须 使用 JNI_GetCreatedJavaVMs() 和 AttachCurrentThread()

更多信息在这里: https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/invocation.html

关于java - 使用 JNI 异步调用 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9995148/

相关文章:

Java系统.getProperty ("user.home")

java - 制作一个倒计时器

Java在运行时获取maven依赖的版本

c++ - 通过从具体类派生来填充抽象类成员

java - JNI 无符号字符到字节数组

android - 操作 256x256 位图使 android-ndk 的 JNI 崩溃

java - 如何在 Android Spinner 的下拉菜单中启用快速滚动(拇指)?

c++ - 如何在调试版本中测试断言,但在发布版本中返回值?

c++ - VC9下SQLite3的麻烦

Android Camera takePicture 正在使用预览小缓冲区