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

How to declare native cpp method for which declared in kotlin companion object?

我有一个 Kotlin class,它只是声明了一些 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
}

伴随对象实现为内部 class JNILib$Companion 的实例。 $ 必须出现在 C++ 函数的签名中,而 the way you accomplish that 是使用转义序列 _0XXXX,其中 XXXX 是 unicode 字符代码。 $ 的字符代码是十六进制 24,即转义序列是 _00024,这意味着你的 C++ 函数名称变为 Java_com_package_JNILib_00024Companion_getAppId.

或者,您可以通过使用 @JvmStatic 注释使 getAppId 成为 JNILib 的静态方法。你的 C++ 函数名称应该是 Java_com_package_JNILib_getAppId,参数是 JNIEnv *, jclass(注意 jclass 而不是 jobject 因为 getAppId 现在是 class方法而不是实例方法)。