В моем текущем проекте мне нужно реализовать функцию нативных c libs в java проекте. Я использую JNA. И до сих пор достигли хороших результатов. Теперь я застрял в следующей проблеме.
Мне нужно вызвать нативную функцию c:
int retrieveResult(ResultStruct * pResult)
Где структура определена следующим образом:
typedef struct tag_ResultStruct
{
const void *pBuffer;
int sizeX;
int sizeY;
} ResultStruct;
В Java я создал класс, представляющий структуру:
public class ResultStruct extends Structure{
public Pointer pBuffer;
public int sizeX;
public int sizeY;
@Override
protected List<String> getFieldOrder(){
return Arrays.asList(new String[] {"pBuffer", "sizeX", "sizeY"});
}
public ResultStruct(){
}
}
Я вызываю метод Native C с помощью
private interface MyCLib extends Library{
MyCLib INSTANCE = Native.load("myclib", MyCLib.class);
int retrieveResult(ResultStruct pResult);
}
ResultStruct resultStruct = new ResultStruct();
resultStruct.pBuffer = new Memory(bufferLen);
int res = MyCLib.INSTANCE.retrieveResult(resultStruct);
Теперь я могу получить ожидаемые значения из sizeX, sizeY и pBuffer с помощью
resultStruct.pBuffer.getByteArray(0, bufferLen);
Теперь я расширяю свою структуру следующим образом:
typedef struct tag_ResultStruct
{
const void* pContext;
const void *pBuffer;
int sizeX;
int sizeY;
} ResultStruct;
И моя Java Структура:
public class ResultStruct extends Structure{
public Pointer pContext;
public Pointer pBuffer;
public int sizeX;
public int sizeY;
@Override
protected List<String> getFieldOrder(){
return Arrays.asList(new String[] {"pContext", "pBuffer", "sizeX", "sizeY"});
}
public ResultStruct(){
}
}
Проблема в том, что я не хочу использовать pContext. Поэтому я не знаю, какой у него размер, и поэтому не инициализирую указатель. Теперь, когда я пытаюсь извлечь значения из буфера, вызвав:
resultStruct.pBuffer.getByteArray(0, bufferLen);
Я не получаю ожидаемые значения из буфера.
Вопрос
Как поступить с более чем динамическим c полем памяти внутри структуры, переданной по ссылке при использовании JNA? Можно оставить Указатель неинициализированным внутри Структуры?
Я ценю любую помощь. Заранее спасибо.