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
找到MessageReceived
class
- 通过
GetMethodID
查找方法(我不确定这里的方法名称是什么)
- 使用
CallVoidMethod
调用它
你可以找到例子here
我正在使用 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
找到 - 通过
GetMethodID
查找方法(我不确定这里的方法名称是什么)
- 使用
CallVoidMethod
调用它
MessageReceived
class
你可以找到例子here