【问题标题】:How to declare native cpp method for which declared in kotlin companion object?如何声明在 kotlin 伴随对象中声明的本机 cpp 方法?
【发布时间】:2018-03-29 11:02:57
【问题描述】:

我有一个 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
}

【问题讨论】:

  • Java_com_package_JNILib_00024Companion_getAppId 怎么样?另一种方法是在 kotlin 中使用 @JvmStatic 注释该方法。那么 C++ 声明应该是Java_com_package_JNILib_getAppId(JNIEnv* env, jclass clazz).
  • @Michael 使用00024Companion 有点奇怪,但我认为@JvmStatic 是正确的答案。你能发表一个答案吗?

标签: android android-ndk kotlin kotlin-android-extensions


【解决方案1】:

伴生对象被实现为内部类JNILib$Companion 的一个实例。 $ 必须出现在 C++ 函数的签名中,the way you accomplish that 使用转义序列 _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,因为getAppId 现在是类方法而不是实例方法)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    相关资源
    最近更新 更多