2017-01-17 22 views
-1

Я обновил jvm openvr binding до последних openvr версии, 1.0.5, но я не уверен в одном.Как реализовать в jna структуру sizeof() с объединенным типом

В 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_t и IntersectionMaskCircle_t

Теперь enum переводит на 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) 

ли появляются правильно мои рассуждения?

+0

ваши слова очень запутывают ... что это о 'sizeof'- вы на самом деле думаете, что это ключевое слово - это какой-то тип данных? Ну, это не так. Его оператор C/C++ ** ** и он даст результат типа 'size_t' - без указателей, если вы не хотите получать размер определенного указателя ... что на самом деле является хорошей идеей, поскольку даже указатели могут быть разных размеров, в зависимости от вашей архитектуры – specializt

+0

Извините, моя ошибка, я изменил, надеюсь, теперь ясно – elect

ответ

2

Вы получаете размер Structure (включая Union) с помощью метода size(). В случае союзов вы получите размер самого большого члена.

Вы устанавливаете нужный тип соединения с Union.setType().

+0

Как я могу проверить/спросить, какая структура союза? Есть ли способ от jna? – elect

+0

Это конкретный вариант реализации. Обычно союз имеет общее поле «тип» в каждом члене, или вы можете указать из контекста, в котором он используется. – technomage

+0

Я, наконец, понял это, спасибо, дорогой! – elect