java — JNI / Kotlin: можно ли передать делегата в JNI?

Я работаю в JNI и мне интересно, можно ли общаться через delegate,

например:

Котлин

typealias MessageReceived = (msg: String) -> Unit

external fun RegisterCallback(callback: MessageReceived)

C ++ (JNI)

JNIEXPORT void Java_some_package_name_Foo_RegisterCallback(JNIEnv* env, jobject, void (*MessageReceived)(jstring msg)) {
if (MessageReceived != nullptr) {
char buffer[260] = {0};
sprintf(buffer, "Callback registered!");
jstring messageJStr = env->NewStringUTF(buffer);
MessageReceived(messageJStr);
env->DeleteLocalRef(messageJStr);
}
}

это невозможно?

Когда я запустил этот код, я не могу получить доступ и получить SIGSEGV (адрес защищен).

я нашел этот, но мне кажется это сложным.

Спасибо за Ваш интерес

0

Решение

Да, это возможно.

Тип вашего MessageReceived должно быть jobject,

Для вызова делегата вам необходимо:

  • находить MessageReceived класс по GetObjectClass
  • найти метод (я не уверен, что имя метода здесь) GetMethodID
  • вызвать его с помощью CallVoidMethod

Вы можете найти пример Вот

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]