Java JNA结构.getFieldOrder()与声明的字段名不匹配

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

我在结构内部定义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 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的顺序不同

  • 是否有人同意我的观点,或者我遗漏了关于如何声明和使用我的JNA结构的一些东西

  • 如果没有bug(即HashSet是故意使用的…),我在声明我的结构时是否犯了错误?如何解决这个问题


  • 您的错误出现在
    mine
    结构中:您需要将字段声明为
    public
    。JNA使用反射,并依赖
    public
    修饰符来修改要映射到本机的字段;否则,它们只是类中的辅助字段

    否则,映射将像您所拥有的那样工作,但是考虑以下改进:

    • 当用作嵌套结构时,不需要使用结构的
      ByValue
      版本。这是默认值。对嵌套结构执行特殊操作的唯一时间是,如果它是
      ByReference
      • 类似地,
        ByReference
        是用作函数参数时的默认值。只有当函数需要
        ByValue
        参数时,才需要特殊处理
    • JNA 5.x中的
      @FieldOrder
      注释取代了
      getFieldOrder()
      覆盖的使用。虽然您的注释有效,但如果您只将该注释放在结构之前,代码的可读性会更好,例如
    @FieldOrder({“数据”,“大小”})
    类his扩展结构{
    //等等。。。
    }
    
    • 接口变量/类/等默认情况下为
      公共
      静态
      、和
      最终
      ,因此使用这些修饰符是多余的

    Thanx它现在可以工作了。你救了我一天。事实上,我忘了在我的结构中将我的字段声明为公共字段。我还将向你提供其他建议。很高兴为你提供帮助,@cknelle——如果这(或任何)答案已经解决了你的问题,请通过点击复选标记来考虑。这向更广泛的社区表明,你已经找到了解决方案并给回答者和你自己带来了一些声誉。(没有义务这么做。)嗨,Daniel Widdis,抱歉耽搁了,完成了,我点击了。