Jna, Pointer ya asignado a la interfaz Proxy

Estoy intentando hacer un puerto kotlin del enlace openvr java y también actualizarlo a 1.0.3

Llegué al punto de escribir la estructura / class IVRSystem

Escribí todos los methods manualmente para asegurarme de que no haya ningún error del traductor automático en Intellij

Me deshice de todos los errores provenientes de un número diferente de campos de getFieldOrder() pero ahora sigo recibiendo un error:

 Exception in thread "main" java.lang.IllegalStateException: Pointer native@0xffffffff already mapped to Proxy interface to native function@0xffffffff (IVRSystem$GetEyeToHeadTransform_callback). Native code may be re-using a default function pointer, in which case you may need to use a common Callback class wherever the function pointer is reused. at com.sun.jna.CallbackReference.getCallback(CallbackReference.java:124) at com.sun.jna.CallbackReference.getCallback(CallbackReference.java:107) at com.sun.jna.Pointer.getValue(Pointer.java:430) at com.sun.jna.Structure.readField(Structure.java:705) at com.sun.jna.Structure.read(Structure.java:565) at IVRSystem.<init>(vr.kt:2091) at VrKt.VR_Init(vr.kt:2116) at VrKt.main(vr.kt:2133) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 

De acuerdo con este comentario , parece que hay varias llamadas a una callback específica ( GetEyeToHeadTransform_callback ?), Pero no es así, he verificado y comprobado dos veces el código, hay una y solo una reference a esa callback.

Que otra cosa podría ser?

Editar:

primero, esto sucede cuando read() en la class IVRSysten , pero no puedo evitar eso …

en segundo lugar, veo que aquí todos los methods anteriores obtienen direcciones reales, como native@0x7fee4bebfd0 , solo GetEyeToHeadTransform siempre es native@0xffffffff

Edit2:

investigando el código original

 dprintf("GetRecommendedRenderTargetSize %p\n", &vr::IVRSystem::GetRecommendedRenderTargetSize); dprintf("GetProjectionMatrix %p\n", &vr::IVRSystem::GetProjectionMatrix); dprintf("GetProjectionRaw %p\n", &vr::IVRSystem::GetProjectionRaw); dprintf("ComputeDistortion %p\n", &vr::IVRSystem::ComputeDistortion); dprintf("GetEyeToHeadTransform %p\n", &vr::IVRSystem::GetEyeToHeadTransform); dprintf("GetTimeSinceLastVsync %p\n", &vr::IVRSystem::GetTimeSinceLastVsync); dprintf("GetD3D9AdapterIndex %p\n", &vr::IVRSystem::GetD3D9AdapterIndex); dprintf("GetDXGIOutputInfo %p\n", &vr::IVRSystem::GetDXGIOutputInfo); dprintf("IsDisplayOnDesktop %p\n", &vr::IVRSystem::IsDisplayOnDesktop); dprintf("SetDisplayVisibility %p\n", &vr::IVRSystem::SetDisplayVisibility); dprintf("GetDeviceToAbsoluteTrackingPose %p\n", &vr::IVRSystem::GetDeviceToAbsoluteTrackingPose); dprintf("ResetSeatedZeroPose %p\n", &vr::IVRSystem::ResetSeatedZeroPose); dprintf("GetSeatedZeroPoseToStandingAbsoluteTrackingPose %p\n", &vr::IVRSystem::GetSeatedZeroPoseToStandingAbsoluteTrackingPose); 

imprime

 GetRecommendedRenderTargetSize 0109871D GetProjectionMatrix 0109AACC GetProjectionRaw 0109AAD1 ComputeDistortion 0109AAF9 GetEyeToHeadTransform 0109AAC2 GetTimeSinceLastVsync 0109AAE5 GetD3D9AdapterIndex 0109AAF4 GetDXGIOutputInfo 0109AADB IsDisplayOnDesktop 0109AAEA SetDisplayVisibility 0109AAE0 GetDeviceToAbsoluteTrackingPose 0109AAEF ResetSeatedZeroPose 0109AAD6 GetSeatedZeroPoseToStandingAbsoluteTrackingPose 0109AAC7 

GetEyeToHeadTransform y GetSeatedZeroPoseToStandingAbsoluteTrackingPose tienen diferentes pointers ..

    El código nativo usa un valor "mágico" de -1 para más de una firma de callback. Cuando se escribió este código de callback para JNA, se asumió que tener el mismo puntero de function asignado a dos firmas diferentes debería ser un error.

    Supongo que -1 valor significa algo así como "usar la callback pnetworkingeterminada" (cuando podría decirse que simplemente un puntero NULL podría haber sido suficiente, a less que la biblioteca esté usando NULL para indicar que no se llamará a la callback).

    Puede solucionar esto anulando Structure.read() o Structure.readField() para devolver un valor mágico o un object de callback constante cuando vea el valor -1 , por ej.

     public void read() { Memory old = getPointer(); Memory m = autoAllocate(size()); // horribly inefficient, but it'll do m.write(0, old.getByteArray(0, size()), 0, size()); useMemory(m); // Zero out the problematic callbacks for (field : problematic_fields) { m.setPointer(field_offset, null); } super.read(); useMemory(old); }