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

L. *_*ter 2 android android-ndk kotlin kotlin-android-extensions

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

class JNILib {

    companion object {

        external fun getAppId(): String

        init {
            System.loadLibrary("native-code")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*ael 6

伴随对象被实现为内部类的实例JNILib$Companion。这$必须出现在 C++ 函数的签名中,而您实现这一点的方法是使用转义序列_0XXXX,其中 XXXX 是 unicode 字符代码。的字符代码$是十六进制24,即转义序列是_00024,这意味着你的C++函数名变成了Java_com_package_JNILib_00024Companion_getAppId

或者,你可以做getAppId的静态方法JNILib通过注释它@JvmStatic。你的 C++ 函数名应该是Java_com_package_JNILib_getAppId, 带参数JNIEnv *, jclass(注意jclass而不是jobject因为getAppIdnow 是一个类方法而不是一个实例方法)。