jni.h
提供这个
struct JNINativeInterface_ {
...
jint (JNICALL *GetVersion)(JNIEnv *env);
...
}
在
C
中调用它可以写成
void test(JNIEnv *env){
// C
jint version = (*env)->GetVersion(env);
// C++
// jint version = env->GetVersion();
}
那么我该如何在 kotlin 中做到这一点?
fun test(env: CPointer<JNIEnvVar>){
val version = // how?
}
在谷歌搜索答案后,几乎没有
Kotlin/Native
和 JNI
的示例,但它们只是基本示例,请帮忙。
提前致谢。
感谢迈克尔。
长答案是
fun test(env: CPointer<JNIEnvVar>){
// getting "JNINativeInterface_" reference from CPointer<JNIEnvVar> by
val jni:JNINativeInterface_ = env.pointed.pointed!!
// get function reference from JNINativeInterface_
// IntelliJ can help to find existing methods
val func = jni.GetVersion!!
// call a function
var version = func.invoke(env)
// above expression can be simplify as
version = env.pointed.pointed!!.GetVersion!!(env)!!
}
希望这可以帮助人们理解 Kotlin/Native 🙂.
Wireless4024的答案是正确的,但我很难让它发挥作用!问题是 JNIEnvVar 未定义,并且不清楚我需要做什么才能解决该问题。我将用您需要做的事情来补充 Wireless4024 的答案,以便能够在 kotlin/native 函数中引用 JNI 结构。
您需要添加对 kotlin“std-jdk8”的依赖。这是用于执行此操作的 gradle kts 脚本代码片段
kotlin {
...
sourceSets {
nativeMain.dependencies {
implementation (kotlin("std-jdk8))
}
...
}
自从您计划制作本机代码以来,这是一个简单的错误,因此您可能认为您不需要 kotlin std-jdk8 依赖项。