如何在jna中实现一个带有union类型的结构sizeof()

时间:2017-01-17 09:53:21

标签: java kotlin jna openvr

我将jvm openvr binding更新为最后一个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;
};

是一个带有枚举类型和联合类型变量的结构,名为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)
}

two other classes依次实施。

我的first guesssizeof(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 个答案:

答案 0 :(得分:2)

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

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