Преобразование указателя на функцию cpp в методы интерфейса Java - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть указатель на функцию cpp:

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

Теперь в Java есть интерфейс:

public interface UpdateCallback {

    void OnDataUpdate(MyClass data);
}

Требуется, чтобы библиотека cpp добавляла себя в качестве слушателя кЯва событие.Итак, cpp вызовет setUpdateCallback (UpdateCallback), чтобы добавить себя в качестве обратного вызова к событиям приложения, если они произошли.

Метод JNI:

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

Как получить указатель на функцию из cpp и mapэто с интерфейсом, так что когда класс приложения вызывает методы интерфейса, вызывается обратный вызов функции cpp ??

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 29 ноября 2018

Ваш 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. 
}
...