无法在 JNI 中引用 Kotlin 数据 class 字段
Unable to refer Kotlin data class field in JNI
我有一个 JNI 代码,用于修改数据 class 中存在的字段值。
我无法引用数据 class 方法来这样做。非常感谢任何帮助。
data class User(val name: String, val age: Int, val hasPet : Boolean)
//method in the activity
private fun modifyUserName(){
val user = User("Vikram", 28, false)
setSampleObject(user)
}
external fun setSampleObject(sampleUser: User)
//Method in JNI.
extern "C"
JNIEXPORT void JNICALL
Java_com_example_samplemvvm_view_nativekit_NativeCPPActivity_setSampleObject(JNIEnv *env,
jobject thiz,
jobject sample_user) {
jclass sampleData = env->GetObjectClass(sample_user);
jfieldID name = env->GetFieldID(sampleData,"getName","Ljava/lang/String;");
env -> SetObjectField(sample_user,name,env->NewStringUTF("Test"));
}
JNI方法中双引号中的getName方法显示为红色,应用程序崩溃并出现以下错误。
JNI DETECTED ERROR IN APPLICATION: JNI NewStringUTF called with pending exception
java.lang.NoSuchFieldError: no "Ljava/lang/String;" field "getName" in class
"Lcom/example/samplemvvm/view/nativekit/user/User;"
你有:
jfieldID name = env->GetFieldID(sampleData,"getName","Ljava/lang/String;");
但是,getName()
将是生成的 JVM 方法的名称,该方法用作 属性 的 getter。支持字段将被命名为 name
。因此,如果您真的想要该字段,请将 "getName"
更改为 "name"
。
不过,您可能要考虑切换到查找 getName()
方法。这样,如果您在 Kotlin class 中覆盖 getter,您的 JNI 将使用覆盖的函数。
我有一个 JNI 代码,用于修改数据 class 中存在的字段值。 我无法引用数据 class 方法来这样做。非常感谢任何帮助。
data class User(val name: String, val age: Int, val hasPet : Boolean)
//method in the activity
private fun modifyUserName(){
val user = User("Vikram", 28, false)
setSampleObject(user)
}
external fun setSampleObject(sampleUser: User)
//Method in JNI.
extern "C"
JNIEXPORT void JNICALL
Java_com_example_samplemvvm_view_nativekit_NativeCPPActivity_setSampleObject(JNIEnv *env,
jobject thiz,
jobject sample_user) {
jclass sampleData = env->GetObjectClass(sample_user);
jfieldID name = env->GetFieldID(sampleData,"getName","Ljava/lang/String;");
env -> SetObjectField(sample_user,name,env->NewStringUTF("Test"));
}
JNI方法中双引号中的getName方法显示为红色,应用程序崩溃并出现以下错误。
JNI DETECTED ERROR IN APPLICATION: JNI NewStringUTF called with pending exception
java.lang.NoSuchFieldError: no "Ljava/lang/String;" field "getName" in class
"Lcom/example/samplemvvm/view/nativekit/user/User;"
你有:
jfieldID name = env->GetFieldID(sampleData,"getName","Ljava/lang/String;");
但是,getName()
将是生成的 JVM 方法的名称,该方法用作 属性 的 getter。支持字段将被命名为 name
。因此,如果您真的想要该字段,请将 "getName"
更改为 "name"
。
不过,您可能要考虑切换到查找 getName()
方法。这样,如果您在 Kotlin class 中覆盖 getter,您的 JNI 将使用覆盖的函数。