Ява — структура с массивом структур JNA

У меня есть следующие C ++ структуры и функции:

typedef struct _Phase_Information
{
char infoMessage[MAX];
} INFORMATION;

typedef struct _Informations
{
int infoCount;
INFORMATION *infoArray;
} INFORMATIONS ;

int GetInformations(INFORMATIONS *pInfos);

Я использую их так:

INFORMATIONS informations;
INFORMATION * informationArray = new INFORMATION[MAX_INFOS];
informations.info = informationArray;
int error = GetInformations(&informations);

Теперь я хочу использовать свою библиотеку C ++ в Java с помощью JNA … поэтому я сделал следующее:

public class Information extends Structure {
public char[] infoMessage = new char[MAX];
public Information () { super(); }
protected List<? > getFieldOrder() {
return Arrays.asList("infoMessage ");
}
public Information (char infoMessage []) {
super();
if ((infoMessage .length != this.infoMessage .length))
throw new IllegalArgumentException("Wrong array size !");
this.infoMessage  = infoMessage ;
}

public static class ByReference extends Information implements Structure.ByReference {};
public static class ByValue extends Information implements Structure.ByValue {};
}

public class Informations extends Structure {
public int infoCount;
public Information.ByReference infoArray;
public Informations () { super(); }
protected List<? > getFieldOrder() {
return Arrays.asList("infoCount", "infoArray");
}
public Informations(int infoCount, Information.ByReference infoArray) {
super();
this.infoCount= infoCount;
this.infoArray= infoArray;
}
public static class ByReference extends Informations implements Structure.ByReference {};
public static class ByValue extends Informations implements Structure.ByValue {};
}

Я пытался вызвать библиотеку так:

Informations.ByReference informations = new Informations.ByReference();
informations.infoArray= new Information.ByReference();
int error = CLib.GetInformations(Informations);

Information[] test =(Information[])informations.infoArray.toArray(Informations.infoCount);

Иногда я получаю только первый элемент массива, но в остальное время у меня происходит сбой Java … поэтому я считаю, что это связано с нераспределением памяти на сайте Java, но я не могу получить дальше: /

0

Решение

Родные char соответствует Java byte,

Обратите внимание, что ваш пример передает массив размером один GetInformations,

Помимо этого неправильного отображения, которое вполне может быть причиной вашего сбоя, ваше отображение выглядит нормально.

РЕДАКТИРОВАТЬ

Вы должны инициализировать infoCount к размеру массива, который вы передаете («1» в вашем примере). Если вы хотите передать больший массив, вам нужно вызвать .toArray() на informations.infoArray предшествующий звонить GetInformations(), Память для дополнительных элементов массива выделяется при вызове Structure.toArray(); до тех пор у вас есть память только для одного элемента.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]