从 Java 到 C++ 通过 JNI 的回调
callback from java to C++ through JNI
我遇到了一个问题,我有一个 C++ 可执行文件,它通过 JNI 使用 Java jar 文件,现在我需要给一个从 java 模块到C++模块的回调。这里C++模块是较高的模块,而Java模块是较低的模块。任何输入都将是可观的。
如果我
没做错的话,您正在从 C++ 到 JNI 调用 Java 方法,并且您希望为 Java 层提供某种方式来回调您的C++对象。我回答你的问题对了吗?
我这样做的方法是将指向C++对象的指针作为 Java 类的长指针传递:
class JavaClass {
long nativeObjectPtr;
// This is the function getting called from C++.
void MyFunc(long ptr) {
...
nativeObjectPtr = ptr;
}
...
}
从 C++ 调用 MyFunc
时,将指向本机对象的指针作为 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();
}
当然,您必须确保本机对象在整个过程中不会被破坏,以便能够回调它。
在 java 类中创建一个本机方法,使用 JNI 的 RegisterNatives 在C++代码中注册该方法,在C++代码中编写本机包装器方法(就像我们在 java 中所做的那样C++调用)。 调用你的本机方法,你将在 exe C++得到回调。
相关文章:
- 架构决策:返回std::future还是提供回调
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 用于在回调中调用解析器的设计模式
- 如何使用C++对象的成员函数作为 C 样式回调?
- JNI 回调中出错
- 从c++类崩溃到Java的JNI回调
- JNI:从 JVM 到 C++ 的回调无法运行
- JNI回调传递给了C
- 通过JNI从本机线程回调时Java线程泄漏
- jni回调上的黑色精灵
- 从 Java 到 C++ 通过 JNI 的回调
- 如何从 JNI 代码进行 JNIT 测试回调
- 从 pthread 到 JNI 的回调失败
- JNI 回调时出现运行时错误
- Android JNI从C++回调到java
- 如何使用JNI从本机C/ c++代码调用Java applet回调函数
- 通过JNI从c++应用程序调用Java中的c++回调