java - 如何在 jna 中实现具有联合类型的结构体 sizeof()

标签 java kotlin jna openvr

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

在cpp中,有一个带有此虚拟SetOverlayIntersectionMaskIVROverlay类功能:

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)

我的推理正确吗?

最佳答案

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

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

关于java - 如何在 jna 中实现具有联合类型的结构体 sizeof(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41693912/

相关文章:

java - 运行窗体小程序时无法处理 Swing 按钮事件

java - 如何在 for 循环中将数据写入字符串

java - JAVA返回HWND的方法

kotlin - 获取 SortedMap 中的前 N ​​个元素?

android - 如何在 android kotlin 中使用 Socket.IO

java - PointerByReference 不返回值

java - 包装 C 头文件以将其与 dll 和 JNA(erator) 一起使用

java - 列表连接到数据库不显示数据JSP

java - 如何配置生成的代码在 IntelliJ 中的位置?

nullpointerexception - 在 Kotlin 的 map 函数中检查 null