无法在 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 将使用覆盖的函数。