我正在使用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,但对我来说似乎很复杂。
感谢您的关注
答案 0 :(得分:1)
是的。
您的MessageReceived
的类型应为jobject
。
要调用委托,您需要:
MessageReceived
查找GetObjectClass
类GetMethodID
查找方法(我不确定此处的方法名称是什么)CallVoidMethod
您可以找到示例here