如何声明在 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方法而不是实例方法)。
我有一个 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方法而不是实例方法)。