简体   繁体   English

JNA函数指针作为结构字段

[英]JNA function pointer as structure field

I have a structure definition with function pointers as fields: 我有一个函数定义为字段的结构定义:

https://github.com/slembcke/Chipmunk2D/blob/master/include/chipmunk/cpBody.h#L44 https://github.com/slembcke/Chipmunk2D/blob/master/include/chipmunk/cpBody.h#L44

I define a JNA sructure like this 我定义了这样的JNA结构

package com.dewdropgames.chipmunk2djna.structs;

import com.dewdropgames.chipmunk2djna.CpVect;
import com.dewdropgames.chipmunk2djna.callbacks.CpBodyPositionFunc;
import com.sun.jna.Structure;

import java.util.Arrays;
import java.util.List;

public class CpBody extends Structure {
    private static final List<String> FIELD_ORDER = Arrays.asList(
/// ...
            "position_func",
/// ...
    );

    @Override
    protected List getFieldOrder() {
        return FIELD_ORDER;
    }

    public static class ByReference 
        extends CpBody 
        implements Structure.ByReference{};

// ...
    public CpBodyPositionFunc position_func;
// ...

And, following the ducumentation https://jna.java.net/nonav/javadoc/overview-summary.html#callbacks I define a callback interface like this: 并且,在文档https://jna.java.net/nonav/javadoc/overview-summary.html#callbacks之后,我定义了一个回调接口,如下所示:

package com.dewdropgames.chipmunk2djna.callbacks;

import com.dewdropgames.chipmunk2djna.structs.CpBody;

public interface CpBodyPositionFunc extends Callback {
    void invoke(CpBody body, double dt);
}
// typedef void (*cpBodyPositionFunc)(cpBody *body, cpFloat dt);

But when I run this code, there's an exeption: 但是当我运行这段代码时,有一个例外:

Caused by: java.lang.IllegalArgumentException: 
The type "com.dewdropgames.chipmunk2djna.callbacks.CpBodyPositionFunc"
is not supported: 
Native size for type
"com.dewdropgames.chipmunk2djna.callbacks.CpBodyPositionFunc" 
is unknown

What do I do wrong here? 我在这里做什么错? Btw, behaves ok if I just define such fields as Pointer and never try to call them. 顺便说一句,如果我只是将这些字段定义为Pointer且从不尝试调用它们,则表现良好。

Stacktrace: 堆栈跟踪:

:runAppException in thread "main" java.lang.IllegalArgumentException: Invalid Structure field in class com.dewdropgames.chipmunk2djna.structs.CpSpace$ByReference, field name '_staticBody' (class com.dewdropgames.chipmunk2djna.structs.CpBody): Invalid Structure field in class com.dewdropgames.chipmunk2djna.structs.CpBody, field name 'position_func' (interface com.dewdropgames.chipmunk2djna.callbacks.CpBodyPositionFunc): The type "com.dewdropgames.chipmunk2djna.callbacks.CpBodyPositionFunc" is not supported: Native size for type "com.dewdropgames.chipmunk2djna.callbacks.CpBodyPositionFunc" is unknown
        at com.sun.jna.Structure.validateField(Structure.java:1109)
        at com.sun.jna.Structure.validateFields(Structure.java:1119)
        at com.sun.jna.Structure.<init>(Structure.java:179)
        at com.sun.jna.Structure.<init>(Structure.java:172)
        at com.sun.jna.Structure.<init>(Structure.java:159)
        at com.sun.jna.Structure.<init>(Structure.java:151)
        at com.dewdropgames.chipmunk2djna.structs.CpSpace.<init>(CpSpace.java:13)
        at com.dewdropgames.chipmunk2djna.structs.CpSpace$ByReference.<init>(CpSpace.java:54)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
        at java.lang.Class.newInstance(Class.java:442)
        at com.sun.jna.Structure.newInstance(Structure.java:1773)
        at com.sun.jna.Structure.newInstance(Structure.java:1759)
        at com.sun.jna.Function.invoke(Function.java:424)
        at com.sun.jna.Function.invoke(Function.java:323)
        at com.sun.jna.Library$Handler.invoke(Library.java:236)
        at com.sun.proxy.$Proxy0.cpSpaceNew(Unknown Source)
        at com.dewdropgames.chipmunk2djna.FirstTry.main(FirstTry.java:31)
Caused by: java.lang.IllegalArgumentException: Invalid Structure field in class com.dewdropgames.chipmunk2djna.structs.CpBody, field name 'position_func' (interface com.dewdropgames.chipmunk2djna.callbacks.CpBodyPositionFunc): The type "com.dewdropgames.chipmunk2djna.callbacks.CpBodyPositionFunc" is not supported: Native size for type "com.dewdropgames.chipmunk2djna.callbacks.CpBodyPositionFunc" is unknown

Initializing cpSpace - Chipmunk v7.0.1 (Debug Enabled)
Compile with -DNDEBUG defined to disable debug mode and runtime assertion checks
        at com.sun.jna.Structure.validateField(Structure.java:1109)
        at com.sun.jna.Structure.validateFields(Structure.java:1119)
        at com.sun.jna.Structure.<init>(Structure.java:179)
        at com.sun.jna.Structure.<init>(Structure.java:172)
        at com.sun.jna.Structure.<init>(Structure.java:159)
        at com.sun.jna.Structure.<init>(Structure.java:151)
        at com.dewdropgames.chipmunk2djna.structs.CpBody.<init>(CpBody.java:15)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
        at java.lang.Class.newInstance(Class.java:442)
        at com.sun.jna.Structure.newInstance(Structure.java:1773)
        at com.sun.jna.Structure.newInstance(Structure.java:1759)
        at com.sun.jna.Structure.size(Structure.java:1030)
        at com.sun.jna.Native.getNativeSize(Native.java:1172)
        at com.sun.jna.Structure.getNativeSize(Structure.java:2072)
        at com.sun.jna.Structure.getNativeSize(Structure.java:2062)
        at com.sun.jna.Structure.validateField(Structure.java:1105)
        ... 19 more
Caused by: java.lang.IllegalArgumentException: The type "com.dewdropgames.chipmunk2djna.callbacks.CpBodyPositionFunc" is not supported: Native size for type "com.dewdropgames.chipmunk2djna.callbacks.CpBodyPositionFunc" is unknown
        at com.sun.jna.Native.getNativeSize(Native.java:1180)
        at com.sun.jna.Structure.getNativeSize(Structure.java:2072)
        at com.sun.jna.Structure.getNativeSize(Structure.java:2062)
        at com.sun.jna.Structure.validateField(Structure.java:1105)
        ... 37 more

Indeed, this time semi-automatic imports failed me, there was another interface imported, found this line: import javax.security.auth.callback.Callback; 确实,这次半自动导入使我失败了,导入了另一个接口,发现了这一行: import javax.security.auth.callback.Callback;

JNA interfaces for native functions should implement com.sun.jna.Callback 用于本机功能的JNA接口应实现com.sun.jna.Callback

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM