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

Java JNI/Kotlin:是否可以将委托传递给JNI?,java,c++,kotlin,java-native-interface,Java,C++,Kotlin,Java Native Interface,我正在使用JNI,我想知道是否可以通过委托进行通信 例如: Kotlin typealias MessageReceived = (msg: String) -> Unit external fun RegisterCallback(callback: MessageReceived) C++(JNI) JNIEXPORT void Java\u some\u package\u name\u Foo\u RegisterCallback(JNIEnv*env,jobject,voi

我正在使用JNI,我想知道是否可以通过
委托
进行通信

例如:

Kotlin

typealias MessageReceived = (msg: String) -> Unit

external fun RegisterCallback(callback: MessageReceived)

C++(JNI)

JNIEXPORT void Java\u some\u package\u name\u Foo\u RegisterCallback(JNIEnv*env,jobject,void(*MessageReceived)(jstring msg)){
if(MessageReceived!=nullptr){
字符缓冲区[260]={0};
sprintf(缓冲区,“已注册回调!”);
jstring messageJStr=env->NewStringUTF(缓冲区);
MessageReceived(messageJStr);
env->DeleteLocalRef(messageJStr);
}
}
不可能吗

当我运行此代码时,我无法访问和获取SIGSEGV(地址访问保护)

我发现了,但我觉得很复杂

感谢您的关注

是的,这是可能的

您收到的
消息的类型应为
jobject

要调用委托,您需要:

  • 查找
    MessageReceived
    class by
    GetObjectClass
  • 通过
    GetMethodID
  • 使用
    CallVoidMethod

您可以找到示例

我的意思是,没有jmethodID或其他东西。您不能在没有“jmethodID或其他东西”的情况下调用java方法:)我还找到了关于
CallXXXMethod
,但它应该是在本机调用包装类中定义的目标方法。我想知道是否可以通过传递它来调用委托。对不起,我的英语不好。所有的
CallXXXMethod
都是一样的。唯一的区别是被调用方法的类型。