Java JNA结构.getFieldOrder()与声明的字段名不匹配
我在结构内部定义JNA结构时遇到以下异常: 线程“main”java.lang.Error中出现异常:com.MyInterface$mine$ByReference类上的Structure.getFieldOrder()返回与声明的字段名不匹配的名称([color、data、hello、rice、str、wild]) 请参见我的Cpp结构:Java JNA结构.getFieldOrder()与声明的字段名不匹配,java,structure,jna,Java,Structure,Jna,我在结构内部定义JNA结构时遇到以下异常: 线程“main”java.lang.Error中出现异常:com.MyInterface$mine$ByReference类上的Structure.getFieldOrder()返回与声明的字段名不匹配的名称([color、data、hello、rice、str、wild]) 请参见我的Cpp结构: typedef struct s_mine { e_color color; //e_color is enum typ
typedef struct s_mine
{
e_color color; //e_color is enum type made of int values
his data;
int str;
unsigned int wild;
unsigned int hello;
float rice;
} mine;
typedef struct s_his
{
unsigned char * data;
unsigned int size;
} his;
请参见下面的示例,即MyInterface.java:
公共接口MyInterface扩展库{
公共静态类his扩展结构{
公共静态类ByReference扩展了他的实现结构。ByReference{}//需要结构地址,因为它是特定包装方法的参数
公共静态类ByValue扩展了his实现的结构。ByValue{}//需要“mine”结构中的结构值
公共指针数据;
公共整数大小;
@凌驾
受保护列表getFieldOrder(){
返回Arrays.asList(新字符串[]{“data”,“size”});
}
}
公共级矿山结构{
公共静态类ByReference扩展了结构。ByReference{}
内色;
his.ByValue数据;
int-str;
野生动物;
int你好;
漂浮大米;
@凌驾
受保护列表getFieldOrder(){
返回Arrays.asList(新字符串[]{“color”、“data”、“str”、“wild”、“hello”、“rice”});
}
}
}
使用MyInterface的主类包含以下行,其中我有一个关于“mine”结构字段顺序的异常:
final MyInterface.mine.ByReference mine\u ref=new MyInterface.mine.ByReference();
因此,我调试代码,以便将JNA following Structure.class逐步引入以下getFields方法(在该方法中,我得到了异常(下面的第二个异常):
protectedlist getFields(布尔强制){
List flist=getFieldList();
Set name=新的HashSet();
for(字段f:flist){
name.add(f.getName());
}
List fieldOrder=fieldOrder();
if(fieldOrder.size()!=flist.size()&&flist.size()>1){
如果(强制){
抛出新错误(“+getClass()上的Structure.getFieldOrder())
+(fieldOrder.size()
这就是当在getFields方法中引发异常时,我在探索以下字段值时得到的结果
fieldOrder = [color, data, str, wild, hello, rice]
orderedNames = [str, color, data, hello, rice, wild]
由于名称是空的,所以引发了异常。无论如何,由于HashSet java.util类不能保证顺序随时间保持不变,我肯定认为JNA Structure.java中存在错误。
因为my fieldOrder的顺序是通过new HashSet(fieldOrder)
指令以随机顺序排序的,因此与orderedNames的顺序不同
您的错误出现在
mine
结构中:您需要将字段声明为public
。JNA使用反射,并依赖public
修饰符来修改要映射到本机的字段;否则,它们只是类中的辅助字段
否则,映射将像您所拥有的那样工作,但是考虑以下改进:
- 当用作嵌套结构时,不需要使用结构的
版本。这是默认值。对嵌套结构执行特殊操作的唯一时间是,如果它是ByValue
。ByReference
- 类似地,
是用作函数参数时的默认值。只有当函数需要ByReference
参数时,才需要特殊处理ByValue
- 类似地,
- JNA 5.x中的
注释取代了@FieldOrder
覆盖的使用。虽然您的注释有效,但如果您只将该注释放在结构之前,代码的可读性会更好,例如getFieldOrder()
@FieldOrder({“数据”,“大小”})
类his扩展结构{
//等等。。。
}
- 接口变量/类/等默认情况下为
、公共
、和静态
,因此使用这些修饰符是多余的最终