我有一个 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 getAppId
now 是类方法而不是实例方法)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)