如何在jna中实现一个联合类型的结构sizeof()

我更新了jvm openvr绑定到最后一个openvr版本1.0.5,但我不确定一件事。

在cpp中,有这个虚拟SetOverlayIntersectionMask函数的IVROverlay类:

 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; }; 

是一个具有枚举类型和联合类型变量的结构,称为VROverlayIntersectionMaskPrimitive_Data_t

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

正在由上面的两个类实现, IntersectionMaskRectangle_tIntersectionMaskCircle_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) 

我的推理是否正确?

您可以使用size()方法获取Structure (包括Union )的size() 。 在工会的情况下,你会得到最大的成员的大小。

使用Union.setType()设置所需的联合类型。