首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >已映射到代理接口的指针

已映射到代理接口的指针
EN

Stack Overflow用户
提问于 2016-10-20 14:24:27
回答 2查看 456关注 0票数 2

我正在尝试做一个科林港openvr java绑定,并更新到1.0.3

我到了写结构/类别的时候

我手动编写了所有方法,以确保这不会是Intellij中自动翻译器的任何错误

我消除了来自getFieldOrder()不同数量字段的所有错误,但现在我仍然得到了一个错误:

代码语言:javascript
复制
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() on IVRSysten类时会发生这种情况,但我无法避免.

第二,我看到这里以前的所有方法都有真实的地址,比如native@0x7fee4bebfd0,只有GetEyeToHeadTransform总是得到native@0xffffffff.

Edit2:

调查原始代码

代码语言:javascript
复制
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);

印出

代码语言:javascript
复制
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

GetEyeToHeadTransformGetSeatedZeroPoseToStandingAbsoluteTrackingPose有不同的指针。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-21 18:34:48

本机代码使用-1的“魔术”值进行多个回调签名。在编写JNA的回调代码时,假设将相同的函数指针映射到两个不同的签名应该是一个错误。

我猜想-1值意味着“使用默认回调”(可以说,一个空指针可能已经足够了,除非库使用NULL来指示不调用回调)。

当您看到Structure.read()Structure.readField()值时,您可能会通过重写-1Structure.readField()返回一个神奇的值或常量回调对象来解决这个问题。

代码语言:javascript
复制
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);
}
票数 1
EN

Stack Overflow用户

发布于 2019-10-28 12:06:32

尽管这是一个老问题,但我喜欢分享我的经验。在我的例子中,我有一个本机对象,它作为一个带有代理方法映射的结构传递给Java。对象是某种类型的会话,它实现了一个应该删除本机对象本身的关闭方法。一旦调用close并删除本机对象,就会引发类似的异常。问题是函数调用JNA后,将重新合并已删除的本机对象。这可以通过将自动读取设置为false来解决。

代码语言:javascript
复制
public void close(Handler handler) {
    setAutoRead(false);
    close.invoke(this, handler);
    setAutoWrite(false);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40157199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档