将cpp函数指针转换为Java接口方法

时间:2018-11-28 08:02:11

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

我有一个cpp函数指针:

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

现在在Java中,我有一个接口:

public interface UpdateCallback {

    void OnDataUpdate(MyClass data);
}

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

JNI方法:

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

如何从cpp获取函数指针并将其与接口映射,以便在应用程序类调用接口方法时调用cpp函数回调?

请帮助。

1 个答案:

答案 0 :(得分:1)

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

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

从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. 
}