如何从 Kotlin/Native 调用 JNIEnv 函数

问题描述 投票:0回答:2

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
的示例,但它们只是基本示例,请帮忙。

提前致谢。

java-native-interface kotlin-native
2个回答
1
投票

感谢迈克尔。

长答案是

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 🙂.


0
投票

Wireless4024的答案是正确的,但我很难让它发挥作用!问题是 JNIEnvVar 未定义,并且不清楚我需要做什么才能解决该问题。我将用您需要做的事情来补充 Wireless4024 的答案,以便能够在 kotlin/native 函数中引用 JNI 结构。

您需要添加对 kotlin“std-jdk8”的依赖。这是用于执行此操作的 gradle kts 脚本代码片段

kotlin {
    ...
   sourceSets {
       nativeMain.dependencies {
            implementation (kotlin("std-jdk8))
   }
    ...
}

自从您计划制作本机代码以来,这是一个简单的错误,因此您可能认为您不需要 kotlin std-jdk8 依赖项。

© www.soinside.com 2019 - 2024. All rights reserved.