我正在工作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 (地址访问受保护)。
我找到了这,但对我来说似乎很复杂。
谢谢你的关心
发布于 2018-11-28 06:21:57
是的是可能的。
MessageReceived的类型应该是jobject。
要调用委托,您需要:
MessageReceived查找GetObjectClass类GetMethodID查找方法(我不确定方法名是什么)CallVoidMethod调用它您可以找到示例这里
https://stackoverflow.com/questions/53512917
复制相似问题