Как реализовать в jna структуру sizeof() с типом объединения

Я обновил привязку jvm openvr до последней версии openvr, 1.0.5, но я не уверен в одном.

В cpp есть IVROverlay класс с этим виртуальным SetOverlayIntersectionMask функция:

virtual EVROverlayError SetOverlayIntersectionMask(
             VROverlayHandle_t ulOverlayHandle, 
             VROverlayIntersectionMaskPrimitive_t *pMaskPrimitives, 
             uint32_t unNumMaskPrimitives, 
             uint32_t unPrimitiveSize = sizeof( VROverlayIntersectionMaskPrimitive_t ) ) = 0;

Мои сомнения касаются последнего аргумента.

VROverlayIntersectionMaskPrimitive_t:

struct VROverlayIntersectionMaskPrimitive_t
{
    EVROverlayIntersectionMaskPrimitiveType m_nPrimitiveType;
    VROverlayIntersectionMaskPrimitive_Data_t m_Primitive;
};

является структурой с типом enum и переменной типа union, называемой VROverlayIntersectionMaskPrimitive_Data_t:

typedef union
{
    IntersectionMaskRectangle_t m_Rectangle;
    IntersectionMaskCircle_t m_Circle;
} VROverlayIntersectionMaskPrimitive_Data_t;

Который реализуется двумя классами прямо выше, IntersectionMaskRectangle_t а также IntersectionMaskCircle_t

Теперь перечисление переводится в Int а последняя? Так как это должен быть указатель, я думаю, это будет Pointer.SIZE?

Однако это моя реализация, где VROverlayIntersectionMaskPrimitive_Data_t абстрактный класс:

abstract class VROverlayIntersectionMaskPrimitive_Data_t : Structure {

    constructor() : super()
    constructor(peer: Pointer) : super(peer)
}

Реализованы поочередно двумя другими классами.

Мое первое предположение, что sizeof(VROverlayIntersectionMaskPrimitive_Data_t) переводит на Int + Pointer.SIZE

@JvmOverloads fun setOverlayIntersectionMask(
                ulOverlayHandle: VROverlayHandle_t,
                pMaskPrimitives: VROverlayIntersectionMaskPrimitive_t.ByReference, 
                unNumMaskPrimitives: Int, 
                unPrimitiveSize: Int = Int.BYTES + Pointer.SIZE)

Мое рассуждение кажется правильным?

1 ответ

Решение

Вы получаете размер Structure (в том числе Union) с size() метод. В случае союзов вы получите размер самого большого члена.

Вы устанавливаете желаемый тип объединения с Union.setType(),

Другие вопросы по тегам