1 - Отображения JNA
Отображения предназначены для прямой связи типов на стороне Java с соответствующими типами собственных сторон.Когда память, необходимая для этих отображений, хорошо известна, JNA работает очень хорошо.К сожалению, когда объем встроенной памяти, подлежащей отображению, является переменным, требуется немного усилий для выделения и сопоставления необходимой встроенной памяти.Есть несколько способов сделать это, с различными уровнями абстракции / контроля.
2 - уже есть QueueInfo [] (часть 1)
Скак вы определили QueueInfo
в своем вопросе, это не поможет.Вы определили только класс на стороне Java, но класс Pointer
подразумевает собственный указатель памяти.Вы должны изменить свой класс, чтобы расширить Structure
и использовать public
в своем поле count
.Обратите внимание, что создание этой структуры будет выделять только собственную память для int
и Pointer
.Память для самого массива должна быть выделена отдельно.
3 - выделить массив с плавающей точкой
Как я уже упоминал в комментариях, один из способов сделать это - выделить собственную память для массива с плавающей точкой:
Memory buffer = new Memory(count * Native.getNativeSize(Float.TYPE));
Затем, если вы определили float[] buf
, вы можете скопировать его в собственную память, используя
buffer.write(0L, buf, 0, count);
Затем вы можете просто использовать buffer
в качестве поля priorities
вашего QueueInfo
экземпляра.
2 - уже есть QueueInfo [] (часть 2)
Теперь на вопрос, вы не можете просто установить указатель на первый элемент, если вы не знаете, что выиметь непрерывный массив С-стороны.Вы можете использовать Structure::toArray
для выделения памяти (а затем заполнять каждый элемент) или отдельно создавать массив (смежных) указателей и копировать значение Pointer
из ваших отдельно выделенных структур.Для варианта toArray
вам не нужен конструктор указателя, если вы непосредственно устанавливаете значения в сгенерированном массиве, но конструктор указателя может упростить копирование (из одного блока памяти в другой).
Сводка
Вариант 1: создание отдельных структур QueueInfo
с использованием метода Pointer.write()
для массива с плавающей запятой.Может быть полезно создать конструктор, который принимает float[]
в качестве аргумента и устанавливает count
, а также выделяет и устанавливает переменную priorities
, как описано выше.Затем создайте массив Pointer
s для структуры CreateInfo
и скопируйте указатель ссылки каждого элемента.
Вариант 2: создайте массив структур, используя Structure::toArray
для выделения собственной памяти;затем выполните итерацию по этой структуре и непосредственно создайте структуры QueueInfo
с соответствующим индексом.