Как реализовать в 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()
,