java - 将cpp函数指针转换为java接口(interface)方法

标签 java android c++ java-native-interface jnienv

我有一个cpp函数指针:

using MyclassPtr = std::shared_ptr<Myclass>;
using UpdateCallback = std::function<void(const MyclassPtr&)>;

现在在 java 中我有一个接口(interface):

public interface UpdateCallback {

    void OnDataUpdate(MyClass data);
}

要求是 cpp 库应该将自己添加为 java 事件的监听器。因此,如果发生,cpp 将调用 setUpdateCallback(UpdateCallback) 将自身添加为对应用程序事件的回调。

JNI 方法:

void MyCustomClassJNI::setUpdateCallback(const UpdateCallback & callback)
{.......}

如何从cpp中获取函数指针并与接口(interface)进行映射,使得应用类调用接口(interface)方法时,调用cpp函数回调??

请帮忙。

最佳答案

您的 void OnDataUpdate(MyClass data); 实际上是将 MyClass 数据对象传递给 JNI。

MyClass 数据应该是对您的 C++ 层有意义的对象,而不是向下传递回调接口(interface)指针。

从 Java 方面

// Java code
public class MyCustomClassJNI implements UpdateCallback {

    public native void notifyJni(MyClass data);

    @Override
    void OnDataUpdate(MyClass data) {
        this.notifyJniPeer(data);
    }
}

然后在 C++ 端,您应该有一个如下所示的 JNI 方法:

JNIEXPORT void JNICALL
Java_your_package_name_MyCustomClassJNI_notifyJni(JNIEnv *env, jobject myClassData) {
    // read myClassData object. 
}

关于java - 将cpp函数指针转换为java接口(interface)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53514724/

相关文章:

android - 在我所有的应用程序中显示 View

c++ - 我的 https C++ 代码在某些网站上不起作用 (binance)

java - 在Java中是否可以导入数组类型?

java - Hibernate:删除前检查外键约束违规?

android - URLConnection 或 HTTPClient : Which offers better functionality and more efficiency?

java - 根据 Google Maps API 的缩放级别显示商店

java - Java 在不同平台上有何不同?

java - Spring - 用新的属性文件值替换 bean 属性值

c++ - 如何检查字符串是否在字符串数组中

c++ - 在多线程应用程序中使用 vector