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

JNI/Kotlin: Is it possible to pass delegate to JNI?

我正在使用 JNI,我想知道是否可以通过 delegate.

进行通信

例如:

Kotlin

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,但对我来说似乎很复杂。

感谢您的关注

是的,这是可能的。

您的MessageReceived类型应该是jobject

要调用委托,您需要:

  • 通过GetObjectClass
  • 找到MessageReceivedclass
  • 通过GetMethodID
  • 查找方法(我不确定这里的方法名称是什么)
  • 使用CallVoidMethod
  • 调用它

你可以找到例子here