#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
это ajobject
, а не ajclass
.3. Вы могли бы попробовать передавать по значению, а не по ссылке
4. Почему yoiu устанавливает поле в классе, когда поле не является статическим? Вы должны установить его в объекте. В вашем коде отсутствует проверка ошибок, которая выявила бы это с исключением. Вы также проверяете
clazz == null
в неправильном месте, совсем не то, что вам нужноclazz
, и вы вообще не проверяетеfid == 0
ни результат, ни результатsetObjectField()
.5. @luckyging3r Здесь нет передачи по ссылке.