java - 通过JNI从java到C++的回调

标签 java c++ java-native-interface

我面临一个问题,我有一个c++可执行文件,它通过JNI使用java jar文件,现在我需要从java模块到C++模块进行回调。(这里C++模块是更高的模块,而java模块是较低的模块。)任何输入都将是值得重视的。

最佳答案

如果我没猜错的话,您正在通过 JNI 从 C++ 调用 Java 方法,并且您希望为 Java 层提供某种方法来回调您的 C++ 对象。我问你的问题正确吗?

我执行此操作的方法是将指向 C++ 对象的指针作为 long 传递给 Java 类:

class JavaClass {
    long nativeObjectPtr;

    // This is the function getting called from C++.
    void MyFunc(long ptr) {
        ...
        nativeObjectPtr = ptr;
    }

    ...
}

当您从 C++ 调用 MyFunc 时,将指针作为 long 传递给您的 native 对象:

MyClass* ptr = ...; // Pointer to your native object;
env->CallVoidMethod(javaObj, myFuncMethodID, (long)ptr);

在您的 Java 类中,创建一个回调到您的 native 对象的 native 函数:

// inside JavaClass
native void callBackIntoNative(long ptr);

void CallBackIntoNative() {
    callBackIntoNative(nativeObjectPtr);
}

在 native 函数的C++ 实现中,只需 long 转换为 C++ 类的类型,然后在其上调用适当的函数:

JNIEXPORT jobject JNICALL JavaClass_callBackIntoNative(JNIEnv* env, jobject obj, jlong ptr)
{
    MyClass* o = reinterpret_cast<MyClass*>(ptr);

    // We have the pointer to our native object, simply call the needed function.
    o->Callback();
}

当然,您必须确保您的 native 对象在整个时间内不会被销毁,以便能够回调它。

关于java - 通过JNI从java到C++的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19960911/

相关文章:

java - 从 C++ JNI 获取 Java 类中的实例变量

java - Hibernate,在不加载关联实体的情况下获取外部ID

java - 使用JAVA合并多个XML文件的不同节点

c++ - CRTP 复制方法警告潜在的内存泄漏

android - 针对 GLIBC 构建 NDK 库

java - JNI GetMethodID 调用时出现未决异常 java.lang.ClassNotFoundException

java - IntelliJ IDEA 不高亮抛出异常的代码 - 如何打开它?

java - 返回除 null 之外的任何内容

c++ - 确保模板化泛型参数的返回类型

c++ - 当我尝试在 C++ 中创建包含唯一元素的 vector 时发现不起作用