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

How to implement in jna a structure sizeof() with an union type

我更新了 jvm openvr binding to the last openvr 版本,1.0.5,但我不确定一件事。

在 cpp 中,有 IVROverlay class 和这个虚拟 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;

上面的两个 classes 正在实施,IntersectionMaskRectangle_t and IntersectionMaskCircle_t

现在,枚举转换为 Int 但后者呢?既然应该是指针,我猜应该是Pointer.SIZE?

然而这是我的实现,其中 VROverlayIntersectionMaskPrimitive_Data_t 是一个抽象 class:

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)

我的推理是否正确?

你用size()方法得到Structure(包括Union)的大小。对于联合,您将获得最大成员的大小。

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