У меня есть следующая структура C:
typedef struct {
void *instance;
const info_st *info;
} core_st;
, которую я сопоставляю со следующим Java-классом, используя JNA:
public class core_st extends Structure {
public Pointer instance;
public info_st.ByReference info;
@Override
protected List<String> getFieldOrder() {
return Arrays.asList("instance", "info");
}
}
У меня также есть следующая функция, взятая из dll:
uint32_t open_core(uint32_t core_id, core_st **core);
И относительное отображение JNA:
int open_core(int core_id, core_st[] core);
Наконец, я написал Java-программу, которая вызывает функцию следующим образом:
core_st[] cores = new core_st[1];
MyLibrary.INSTANCE.open_core(0, cores);
Функция должназаполнить cores[0]
членов результатом операции "open".В частности, два поля являются двумя указателями на что-то еще.Что происходит, так это то, что поле void *instance
всегда заполнено правильно, но поле info
всегда равно нулю (указатель на ноль).Если я установлю для jna.memory_dump значение true, любой вызов core_st.toString()
всегда будет возвращать один и тот же результат:
memory dump
[70cb64e7]
[fd7f0000]
[00000000]
[00000000]
Это похоже на указатель на info структура не находится в памяти, прочитанной JNA.Один и тот же вызов, выполняемый аналогичной программой на C, работает нормально, оба указателя заполнены правильно.Я также попытался изменить отображение core_st , просто для целей тестирования:
public class core_st extends Structure {
public long instance;
public long info;
@Override
protected List<String> getFieldOrder() {
return Arrays.asList("instance", "info");
}
}
Но я не получил никаких различий в результате. экземпляр получает ненулевое значение, а info всегда равно нулю.Я работаю с 64-битной виртуальной машиной.Мне было интересно, может ли быть проблема в модификаторе const поля info ?Может ли модификатор const в поле структуры указателя типа изменить способ хранения структуры в памяти?