JNI / Kotlin:是否可以将委托传递给JNI?

时间:2018-11-28 05:47:48

标签: java c++ kotlin java-native-interface

我正在使用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(受地址访问保护)。

我找到了this,但对我来说似乎很复杂。

感谢您的关注

1 个答案:

答案 0 :(得分:1)

是的。

您的MessageReceived的类型应为jobject

要调用委托,您需要:

  • 通过MessageReceived查找GetObjectClass
  • 通过GetMethodID查找方法(我不确定此处的方法名称是什么)
  • 使用CallVoidMethod
  • 调用它

您可以找到示例here