如何在 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 guess是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
)的大小。对于联合,您将获得最大成员的大小。
您使用 Union.setType()
设置了所需的联合类型。
我更新了 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 guess是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
)的大小。对于联合,您将获得最大成员的大小。
您使用 Union.setType()
设置了所需的联合类型。