Есть ли конкретный способ иметь дело с константными указателями членов структуры в JNA?

$data = file_get_contents('php://input');
echo $data;

Это сработало для меня.

1
задан Enrico 27 March 2019 в 10:15
поделиться

1 ответ

Может ли модификатор const в поле структуры указателя типа изменить способ хранения структуры в памяти?

Ответ , может быть , зависит от компилятора. Более важным для вашего вопроса является то, как const влияет на способ доступа к полю на нативной стороне. Независимо от того, что вы делаете на стороне Java, после инициализации поля info вашей структуры core_st вы не сможете его изменить.

И именно поэтому вы видите то, что видите здесь: определяя public info_st.ByReference info;, вы инициализируете структуру core_st указателем на NULL и получаете адрес памяти 0x0, сохраненный для этого поля. При доступе к этому полю с помощью API вы не можете изменить адрес памяти, он застрял.

Вы видите те же результаты, инициализирующие его как long со значением по умолчанию (0).

Решение зависит от того, как API заполняет это значение. Если на нативной стороне функция open_core предполагает, что поле info уже инициализировано с указателем на выделенную структуру, и просто изменяет значения в указанной памяти, все готово. Вам просто нужно инициализировать это поле при первом создании структуры.

Вы ничего не говорите мне о том, на что указывает *info, поэтому ответ будет разным в зависимости от того, является ли он массивом info_st структур или одной структурой. Если это одна структура, у вас есть:

public class core_st extends Structure {

    public Pointer instance;
    public info_st.ByReference info = new info_st.ByReference();

}

Это выделит здесь необходимую память для структуры info_st и сохранит указатель только для чтения в вашей структуре core_st , В зависимости от внутренней работы open_core() (и на основании вашего отчета это работает на стороне C), это может сработать!

Если нет, то, возможно, размещение рабочего кода C поможет определить, есть ли другое сопоставление JNA, которое могло бы помочь, или вам нужно обойти его с помощью собственной пользовательской функции-оболочки dll.

0
ответ дан Daniel Widdis 27 March 2019 в 10:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: