【问题标题】:How to implement in jna a structure sizeof() with an union type如何在 jna 中实现具有联合类型的结构 sizeof()
【发布时间】:2017-01-17 09:53:20
【问题描述】:

我将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)

我的推理是否正确?

【问题讨论】:

  • 你的话非常令人困惑......关于sizeof - 你真的认为这个关键字是某种数据类型吗?嗯,它不是。它是一个 C/C++ operator ,它将产生 size_t 类型的结果 - 除非您想检索特定指针的大小,否则不涉及指针......这实际上是一个好主意,因为即使指针的大小可以不同,具体取决于您的架构
  • 对不起,我的错误,我修改了,希望现在清楚

标签: java kotlin jna openvr


【解决方案1】:

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

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

【讨论】:

  • 如何检查/查询联合的结构是什么? jna有办法吗?
  • 这是特定于实现的。通常联合在每个成员中都有一个共同的“类型”字段,或者您可以从使用它的上下文中看出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
  • 1970-01-01
  • 2020-03-02
相关资源
最近更新 更多