c++ 回调方法通过jni反射调用java回调方法代码示例
时间: 2023-07-30 22:10:27 浏览: 156
假设我们要在 C++ 中定义一个回调函数 `onEvent`,并且在 Java 中实现一个回调接口 `MyCallback`,我们可以通过以下步骤实现 C++ 回调方法通过 JNI 反射调用 Java 回调方法:
1. 在 C++ 中定义回调函数 `onEvent`,并通过 JNI 将其注册到 Java 中:
```c++
class MyNativeClass {
public:
typedef void (*CallbackFunc)(int code);
static void setCallback(JNIEnv* env, jobject obj, jobject callback) {
jclass cls = env->GetObjectClass(callback);
if (cls == NULL) return;
jmethodID method = env->GetMethodID(cls, "onEvent", "(I)V");
if (method == NULL) return;
callbackFunc_ = reinterpret_cast<CallbackFunc>(method);
env->DeleteLocalRef(cls);
callbackObj_ = env->NewGlobalRef(callback);
}
static void onEvent(int code) {
if (callbackFunc_ != NULL && callbackObj_ != NULL) {
JNIEnv* env = getJNIEnv();
env->CallVoidMethod(callbackObj_, reinterpret_cast<jmethodID>(callbackFunc_), code);
}
}
private:
static CallbackFunc callbackFunc_;
static jobject callbackObj_;
};
MyNativeClass::CallbackFunc MyNativeClass::callbackFunc_ = NULL;
jobject MyNativeClass::callbackObj_ = NULL;
extern "C" JNIEXPORT void JNICALL Java_com_example_MyClass_setCallback(JNIEnv* env, jobject obj, jobject callback) {
MyNativeClass::setCallback(env, obj, callback);
}
```
2. 在 Java 中定义回调接口 `MyCallback`:
```java
public interface MyCallback {
void onEvent(int code);
}
```
3. 在 Java 中实现一个类 `MyClass`,并将 C++ 回调函数注册到该类中:
```java
public class MyClass {
static {
System.loadLibrary("mylibrary");
}
private static native void setCallback(MyCallback callback);
public void doSomething() {
// 调用 C++ 中的 onEvent 函数,触发回调
MyNativeClass.onEvent(0);
}
}
```
4. 在 Java 中实现 `MyCallback` 接口并注册到 `MyClass` 中:
```java
public class MyCallbackImpl implements MyCallback {
@Override
public void onEvent(int code) {
// 处理回调事件
}
}
MyClass myObject = new MyClass();
myObject.setCallback(new MyCallbackImpl());
```
这样,当 C++ 中调用 `onEvent` 函数时,就会触发 Java 中实现的 `onEvent` 方法,从而实现了 C++ 回调方法通过 JNI 反射调用 Java 回调方法。
阅读全文