我更新了 jvm openvr binding到最后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_t
和 IntersectionMaskCircle_t
现在,枚举转换为 Int
但后者呢?既然它应该是一个指针,我想它应该是Pointer.SIZE
?
但是这是我的实现,其中 VROverlayIntersectionMaskPrimitive_Data_t
是一个抽象类:
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()
设置所需的联合类型。
关于java - 如何在 jna 中实现具有联合类型的结构体 sizeof(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41693912/