Я пытаюсь использовать JNA, чтобы получить некоторые структуры обратно из библиотеки C / C ++, которая содержит массив символов фиксированной длины. В C ++, поскольку я ничего не распределяю динамически, я могу просто вернуть структуру обратно через copy в вызывающую функцию … и хотел бы сохранить эту подпись, если смогу перейти на Java. Я довольно новичок в JNA и Java, так что я уверен, что просто что-то упустил …
Упрощенная версия структуры C ++ выглядит примерно так:
typedef struct MyData_
{
int id;
char name[256];
} MyData;
...
extern "C"MyData fnGetData();
Класс JNA выглядит так:
public static class MyData extends Structure
{
public static class ByValue extends MyData implements Structure.ByValue {}
public int id;
public String name;
@Override
protected List getFieldOrder()
{
return Arrays.asList(new String[] { "id", "name", });
}
}
MyData.ByValue fnGetData();
Это дает ошибку. Я также пытался использовать public char[] name = new char[256];
в объявлении класса, но это не делает правильную вещь.
Если я последую примеру, найденному на http://www.eshayne.com/jnaex/example12.html Я могу заставить его работать, но их решение состоит в том, чтобы я выделил массив символов в куче в моей библиотеке C ++, которая затем мне понадобится для создания второго вызова и освобождения памяти, когда я закончу с этим в Java. Я надеялся, что смогу сохранить это в стеке и просто вернуть копию.
Я могу изменить ситуацию так, чтобы я использовал ByReference, выделял структуру в Java и отправлял ее через список параметров в код C для заполнения, но я не уверен, как выделить буфер символов фиксированной длины на стороне Java …
В идеале я хотел бы сделать только один звонок через JNA и просто придерживаться управляемой памяти. Какие-либо предложения? Лучше всего просто пойти по пути, описанному в этой ссылке, или есть другой способ сделать это?
Ваша собственная структура содержит массив байтов, которые могут быть или не быть NUL
-завершённый. Это должно быть представлено byte[]
в Java и использовать Native.toString(byte[])
преобразовать его в String
,
Вы должны использовать только String
когда родной тип [const ]char *
,