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