通过JNI从java回调到C ++

时间:2013-11-13 17:53:20

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

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

2 个答案:

答案 0 :(得分:4)

如果我做对了,你就是通过JNI从C ++调用Java方法,并且你希望为Java层提供一些方法来回调你的C ++对象。我的问题是否正确?

我这样做的方法是将指针作为 long 传递给您的C ++对象到您的Java类:

class JavaClass {
    long nativeObjectPtr;

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

    ...
}

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

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

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

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

void CallBackIntoNative() {
    callBackIntoNative(nativeObjectPtr);
}

在本机函数的 C ++实现中,只需强制转换长到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();
}

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

答案 1 :(得分:1)

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