У меня есть следующие 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, но я не могу получить дальше: /
Родные char
соответствует Java byte
,
Обратите внимание, что ваш пример передает массив размером один GetInformations
,
Помимо этого неправильного отображения, которое вполне может быть причиной вашего сбоя, ваше отображение выглядит нормально.
РЕДАКТИРОВАТЬ
Вы должны инициализировать infoCount
к размеру массива, который вы передаете («1» в вашем примере). Если вы хотите передать больший массив, вам нужно вызвать .toArray()
на informations.infoArray
предшествующий звонить GetInformations()
, Память для дополнительных элементов массива выделяется при вызове Structure.toArray()
; до тех пор у вас есть память только для одного элемента.
Других решений пока нет …