Как установить правильный размер буфера структуры? - PullRequest
0 голосов
/ 11 июня 2019

У меня есть документация для DLL, которую я должен использовать, где определяется структура, которая является аргументом для одного из собственных методов.

Это выглядит здесь:

typedef struct
{
UNUM32 uiModuleState;
UNUM32 uiSerialNumber;
UNUM32 uiVCIIf;
UNUM32 uiModuleType;
CHAR8 szModuleName[256];
}
VTX_RT_VCI_ITEM;
typedef struct
{
UNUM32 uiNumVCIItems;
VTX_RT_VCI_ITEM * pVCIItems;
}
VTX_RT_VCI_ITEM_LIST;
Calling Convention:
SNUM32 VtxRtGetModuleIds( IO UNUM32* puiBufferLen,
IO VTX_RT_VCI_ITEM_LIST* pVCIItemList);

Я смоделировал эту структуру в JNA, как здесь

VTX_RT_VCI_ITEM

@Structure.FieldOrder({ "uiModuleState",
                        "uiSerialNumber",
                        "uiVCIIf",
                        "uiModuleType",
                        "szModuleName" })
public class VtxRtVciItem extends Structure
{
    public int uiModuleState;

    public int uiSerialNumber;

    public int uiVCIIf;

    public int uiModuleType;

    public char[] szModuleName = new char[VciRuntimeAPI.VTX_RT_SMALL_BUF_SIZE];

    public static class ByReference extends VtxRtVciItem implements Structure.ByReference {}

    public static class ByValue extends VtxRtVciItem implements Structure.ByValue {}

    public VtxRtVciItem()
    {
        super();
        read();
    }
}

VTX_RT_VCI_ITEM_LIST

@Structure.FieldOrder({ "uiNumVCIItems",
                        "pVCIItems" })
public class VtxRtVciItemList extends Structure
{
    public int uiNumVCIItems;

    public VtxRtVciItem.ByReference pVCIItems;

    public VtxRtVciItemList()
    {
        super();

    }
}

Первый аргумент описывается следующим образом puiBufferLen Размер буфера, на который указывает pVCIItemList.

Как установить правильный размер буфера этой структуры?

Я пытался сделать что-то подобное здесь, но размер этой структуры равен 8, что означает, что VtxRtVciItem не вызывается.

VtxRtVciItemList vtxRtVciItemList = new VtxRtVciItemList();
IntByReference puiBufferLen = new IntByReference();
puiBufferLen.setValue(vtxRtVciItemList.size());

1 Ответ

0 голосов
/ 12 июня 2019

Ваш vtxRtVciItemList - это просто структура с количеством элементов списка и указателем на фактический список. Сам буфер списка будет иметь размер каждой структуры в списке (new VtxRtVciItem().size()), умноженный на количество этих элементов (uiNumVCIItems).

Вы не показываете, где вы фактически выделяете этот буфер, для чего вам нужно использовать метод Structure.toArray().

Я думаю, это то, что вы хотите сделать, дайте мне знать, если я неверно истолковал ваш запрос.

int numItems = 42; // whatever your number of list items is
VtxRtVciItem.ByReference[] vtxRtVciItemPointerArray = 
    (VtxRtVciItem.ByReference[]) new VtxRtVciItem.ByReference().toArray(numItems);
VtxRtVciItemList vtxRtVciItemList = new VtxRtVciItemList();
vtxRtVciItemList.uiNumVCIItems = numItems;
vtxRtVciItemList.pVCIItems = vtxRtVciItemPointerArray[0];

А затем перейдите к своей функции:

IntByReference puiBufferLen = 
    new IntByReference(vtxRtVciItemList.uiNumVCIItems * vtxRtVciItemPointerArray[0].size());
VtxRtGetModuleIds(puiBufferLen, pVCIItemList);
...