Jna, указатель уже сопоставлен с интерфейсом Proxy

Я пытаюсь сделать kotlin-порт связывания openvr java, а также обновлять его до 1.0.3

Я получил возможность написать структуру / класс IVRSystem

Я написал все методы вручную, чтобы быть уверенным, что не будет никакой ошибки от автоматического переводчика в Intellij

Я избавился от всех ошибок, возникающих из другого числа полей из getFieldOrder() но теперь я все еще получаю сообщение об ошибке:

 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) 

Согласно этому комментарию , похоже, что существует несколько вызовов определенного обратного вызова ( GetEyeToHeadTransform_callback ?), Но это не так, я проверил и дважды проверил код, есть одна и только одна ссылка на этот обратный вызов.

Что еще может быть?

Редактировать:

во-первых, это происходит, когда я read() в классе IVRSysten , но я не могу этого избежать …

native@0x7fee4bebfd0 вторых, я вижу, что здесь все предыдущие методы получают реальные адреса, такие как native@0x7fee4bebfd0 , только GetEyeToHeadTransform получает всегда native@0xffffffff

Edit2:

исследование исходного кода

 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); 

распечатывает

 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 и GetSeatedZeroPoseToStandingAbsoluteTrackingPose имеют разные указатели.

    Нативный код использует «магическое» значение -1 для более чем одной сигнатуры обратного вызова. Когда этот код обратного вызова для JNA был написан, предполагалось, что наличие одного и того же указателя функции должно быть сопоставлено с двумя разными сигнатурами, должно быть ошибкой.

    Я предполагаю, что значение -1 означает что-то вроде «использовать обратный вызов по умолчанию» (когда, возможно, может быть достаточно указателя NULL, если только библиотека не использует NULL, чтобы указать, чтобы не вызвать обратный вызов).

    Вы можете обойти это, переопределив Structure.read() или Structure.readField() чтобы вернуть магическое значение или постоянный объект обратного вызова, когда вы видите значение -1 , например

     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); } 
    Intereting Posts
    Как избежать избыточной нулевой проверки (предупреждение FindBugs) в поле Котлин Создание соединений P2P с Wi-Fi на Android: создание класса BroadcastReceiver Как издеваться над реактивным репозиторием, который возвращает Observable Зачем нужен репозиторий и сервис + контракт Как получить различную реализацию функции верхнего уровня в Unit и InstrumentTests для Android Как я могу ссылаться на неназванный аргумент выражения when? Что такое семантика инициализации класса Kotlin? Очень загадочная ошибка времени выполнения: операнд Bad type в стеке Как использовать выражение Lamba, чтобы сделать вызовы метода Java менее подробными в Kotlin? Как использовать инъекцию зависимостей в тестах Spek Как отсортировать список объектов в случае нечувствительного порядка? Котлин с разным приращением Какая зависимость maven от огурца котлин? Невозможно подключиться к удаленной базе данных Mongo через Springboot 0xFF0000FF Целочисленный литерал не соответствует ожидаемому типу kotlin.Int