如何声明在 kotlin 伴随对象中声明的本机 cpp 方法?

2024-01-19

我有一个 Kotlin 类,它只声明一些用于 Kotlin 和 C/C++ 交互的方法:

class JNILib {

    companion object {

        external fun getAppId(): String

        init {
            System.loadLibrary("native-code")
        }
    }
}

但是我在声明本机方法时遇到了问题。我试过

extern "C"
JNIEXPORT jstring JNICALL
Java_com_package_JNILib_getAppId(
        JNIEnv *env, jobject /* this */){
    // wrong
}

extern "C"
JNIEXPORT jstring JNICALL
Java_com_package_JNILib_Companion_getAppId(
        JNIEnv *env, jobject /* this */){
    // wrong
}

伴生对象被实现为内部类的实例JNILib$Companion. That $必须出现在 C++ 函数的签名中,并且你实现这一目标的方式 https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/design.html是通过使用转义序列_0XXXX,其中 XXXX 是 unicode 字符代码。字符代码为$是十六进制 24,即转义序列是_00024,这意味着您的 C++ 函数名称变为Java_com_package_JNILib_00024Companion_getAppId.

或者,你可以使getAppId的静态方法JNILib通过注释它@JvmStatic https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-jvm-static/index.html。你的 C++ 函数名称应该是Java_com_package_JNILib_getAppId,带有参数JNIEnv *, jclass(注意jclass代替jobject since getAppIdnow 是类方法而不是实例方法)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何声明在 kotlin 伴随对象中声明的本机 cpp 方法? 的相关文章

随机推荐