Реализовать функцию обратного вызова в качестве интерфейса в JNI и сохранить ссылку в указателе функции - PullRequest
0 голосов
/ 08 ноября 2018

Так что в основном у меня есть такая структура на стороне C ++:

typedef int(*callback)(int, int);
typedef struct InfoCallback {
    int a;
    int b;
    callback call;
} InfoCallback_t;

И мне бы очень понравилось заполнять эту структуру на стороне Java с помощью JNI (или даже SWIG, но это намного сложнее?). Я знаю, что мне следует использовать interface на стороне Java в качестве функции обратного вызова, но я не могу обернуть голову вокруг него.

На стороне Java я бы хотел иметь функцию

private native void fillAndPrintStructCallback(int a, int b, Callback callback);

и я предполагаю, что мой интерфейс должен выглядеть примерно как

public interface Callback {
    int onCallback(int a, int b);
}

где тело функции JNI должно выглядеть как минимум так:

  InfoCallback_t *info = new InfoCallback_t;
  info->a = a;
  info->b = b;
  // can't come up how can I store the reference here to the passed implementation of the Callback
  info->call = ???;
  delete info;

Я знаю, как передавать примитивы, но не могу придумать, как мне сохранить ссылку на стороне C ++ на обратный вызов Java. Как я мог достичь этого?

...