2

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

4

2 回答 2

4

如果我没看错,您是通过 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;
    }

    ...
}

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

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

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

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

void CallBackIntoNative() {
    callBackIntoNative(nativeObjectPtr);
}

在您的本机函数的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();
}

当然,您必须确保您的本机对象在整个时间内都不会被破坏,以便能够回调它。

于 2013-11-13T19:32:46.363 回答
1

在您的 java 类中创建一个本地方法,使用 JNI 的 RegisterNatives 在您的 C++ 代码中注册该方法,在您的 C++ 代码中编写该本地包装方法(就像我们在 java 中对 C++ 的调用一样)。调用您的本机方法,您将在 C++ exe 中获得回调。

于 2013-11-15T08:41:07.823 回答