java — JNA получает структуру, содержащую строку из C / Stack Overflow

Я пытаюсь использовать 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 и просто придерживаться управляемой памяти. Какие-либо предложения? Лучше всего просто пойти по пути, описанному в этой ссылке, или есть другой способ сделать это?

-1

Решение

Ваша собственная структура содержит массив байтов, которые могут быть или не быть NUL-завершённый. Это должно быть представлено byte[] в Java и использовать Native.toString(byte[]) преобразовать его в String,

Вы должны использовать только String когда родной тип [const ]char *,

1

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


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