JNI устанавливает строковое поле

#java #java-native-interface

#java #java-native-интерфейс

Вопрос:

Я пытаюсь работать со структурой между C и Java. Для этого я создал класс Java:

 public class DriveInfo {
    public String val1;
    public String val2;
    public String val3;
}
 

Это я использовал внутри функции Java:

     private void getDriveInfos() {
        DriveInfo newInfo = new DriveInfo();
        newInfo.val1 = "Test";
        getDriveInfo(newInfo);
        logModel.add(logModel.getSize(), newInfo.val1);
    }
 

getDriveInfo объявляется в интерфейсе JNI с:

 private native int getDriveInfo(DriveInfo mClass);

JNIEXPORT jint JNICALL Java_JNIViie_getDriveInfo
  (JNIEnv *env, jobject job, jobject jStruct);

JNIEXPORT jint JNICALL Java_JNIViie_getDriveInfo
  (JNIEnv *env, jobject jobj, jobject jStruct){

    jclass clazz;
    jfieldID fid;
    jstring buffer = env->NewStringUTF("myname");

    clazz = env->GetObjectClass(jStruct);
    fid = env->GetFieldID(clazz,"val1","Ljava/lang/String;");
    if(clazz == 0){
        return 0;
    }
    env->SetObjectField(clazz,fid,buffer);


    return 0;

}

 

Я ожидал, что getDriveInfo функция не будет распечатана "myname" "test" .
Теперь мой вопрос в том, что я сделал неправильно, чтобы val1 не содержать "myname" строку?

Комментарии:

1. Что находится objRet в этой строке: env->SetObjectField(objRet,fid,buffer); ? Похоже, вы устанавливаете поле не для того объекта. Я думаю, так и должно быть jStruct .

2. Кроме того, хотя, возможно, это не связано с вашей проблемой, jStruct это a jobject , а не a jclass .

3. Вы могли бы попробовать передавать по значению, а не по ссылке

4. Почему yoiu устанавливает поле в классе, когда поле не является статическим? Вы должны установить его в объекте. В вашем коде отсутствует проверка ошибок, которая выявила бы это с исключением. Вы также проверяете clazz == null в неправильном месте, совсем не то, что вам нужно clazz , и вы вообще не проверяете fid == 0 ни результат, ни результат setObjectField() .

5. @luckyging3r Здесь нет передачи по ссылке.