Java JNA函数指针作为结构字段
我有一个以函数指针作为字段的结构定义: 我这样定义了一个JNA结构Java JNA函数指针作为结构字段,java,jna,Java,Jna,我有一个以函数指针作为字段的结构定义: 我这样定义了一个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.Arra
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;
// ...
但当我运行这段代码时,有一个例外:
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
我做错了什么?顺便说一句,如果我只定义了Pointer
这样的字段,并且从未尝试调用它们,那么行为正常
堆栈跟踪:
: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
:线程“main”java.lang.IllegalArgumentException中的runAppException:类com.dewdropgames.chipmunk2djna.structs.CpSpace$ByReference中的结构字段无效,字段名“_staticBody”(类com.dewdropgames.chipmunk2djna.structs.CpBody):类com.dewdropgames.chipmunk2djna.structs.CpBody中的结构字段无效,字段名“position_func”(接口com.dewdropgames.chipmunk2djna.callbacks.CpBodyPositionFunc):不支持类型“com.dewdropgames.chipmunk2djna.callbacks.CpBodyPositionFunc”:类型“com.dewdropgames.chipmunk2djna.callbacks.CpBodyPositionFunc”的本机大小未知
位于com.sun.jna.Structure.validateField(Structure.java:1109)
位于com.sun.jna.Structure.validateFields(Structure.java:1119)
位于com.sun.jna.Structure.(Structure.java:179)
位于com.sun.jna.Structure.(Structure.java:172)
位于com.sun.jna.Structure.(Structure.java:159)
位于com.sun.jna.Structure.(Structure.java:151)
在com.dewdropgames.chipmunk2djna.structs.CpSpace.(CpSpace.java:13)
在com.dewdropgames.chipmunk2djna.structs.CpSpace$ByReference.(CpSpace.java:54)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:422)
位于java.lang.Class.newInstance(Class.java:442)
位于com.sun.jna.Structure.newInstance(Structure.java:1773)
位于com.sun.jna.Structure.newInstance(Structure.java:1759)
位于com.sun.jna.Function.invoke(Function.java:424)
位于com.sun.jna.Function.invoke(Function.java:323)
位于com.sun.jna.Library$Handler.invoke(Library.java:236)
位于com.sun.proxy.$Proxy0.cpSpaceNew(未知源)
位于com.dewdropgames.chipmunk2djna.FirstTry.main(FirstTry.java:31)
原因:java.lang.IllegalArgumentException:类com.dewdropgames.chipmunk2djna.structs.CpBody中的结构字段无效,字段名“position_func”(接口com.dewdropgames.chipmunk2djna.callbacks.CpBodyPositionFunc):不支持类型“com.dewdropgames.chipmunk2djna.callbacks.CpBodyPositionFunc”:类型的本机大小“com.dewdropgames.chipmunk2djna.callbacks.CpBodyPositionFunc”未知
初始化cpSpace-花栗鼠v7.0.1(已启用调试)
使用定义为禁用调试模式和运行时断言检查的-DNDEBUG进行编译
位于com.sun.jna.Structure.validateField(Structure.java:1109)
位于com.sun.jna.Structure.validateFields(Structure.java:1119)
位于com.sun.jna.Structure.(Structure.java:179)
位于com.sun.jna.Structure.(Structure.java:172)
位于com.sun.jna.Structure.(Structure.java:159)
位于com.sun.jna.Structure.(Structure.java:151)
在com.dewdropgames.chipmunk2djna.structs.CpBody上(CpBody.java:15)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:422)
位于java.lang.Class.newInstance(Class.java:442)
位于com.sun.jna.Structure.newInstance(Structure.java:1773)
位于com.sun.jna.Structure.newInstance(Structure.java:1759)
位于com.sun.jna.Structure.size(Structure.java:1030)
位于com.sun.jna.Native.getNativeSize(Native.java:1172)
位于com.sun.jna.Structure.getNativeSize(Structure.java:2072)
位于com.sun.jna.Structure.getNativeSize(Structure.java:2062)
位于com.sun.jna.Structure.validateField(Structure.java:1105)
…还有19个
原因:java.lang.IllegalArgumentException:不支持类型“com.dewdropgames.chipmunk2djna.callbacks.CpBodyPositionFunc”:类型“com.dewdropgames.chipmunk2djna.callbacks.CpBodyPositionFunc”的本机大小未知
位于com.sun.jna.Native.getNativeSize(Native.java:1180)
位于com.sun.jna.Structure.getNativeSize(Structure.java:2072)
位于com.sun.jna.Structure.getNativeSize(Structure.java:2062)
位于com.sun.jna.Structure.validateField(Structure.java:1105)
…还有37个
事实上,这次半自动导入失败了,导入了另一个接口,发现这行:导入javax.security.auth.callback.callback;
本机函数的JNA接口应实现
com.sun.JNA.Callback
您的类型似乎未被识别为com.sun.JNA.Callback
的实现。请包含完整的堆栈跟踪。完成后,请查看帖子下方的堆栈跟踪。确保您导入了com.sun.JNA.Callback
给我另一个名为Callback
的类。
: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