JNAerator未命名的Union在结构中缺失

时间:2010-03-23 20:01:49

标签: java jna jnaerator

我正在尝试让JNAerator从C共享库生成一些JNA支持的Java代码,一切都很好,除了它无法生成嵌套在结构中的未命名联合。

示例:

typedef struct MY_STRUCTURE {
  union {
    My_Type1 var1;
    My_Type2 var2;
  };

}MY_STRUCTURE;

如果我更改标题以使联合具有名称,它将起作用。但是出于显而易见的原因,我不能在不破坏我正在尝试使用的共享库的情况下更改标题。

除了将头文件和共享库更改为命名联合之外的任何其他解决方案?

3 个答案:

答案 0 :(得分:4)

这是JNAerator中的一个错误。 我在JNAerator项目的跟踪器中输入了一个问题,因此如果您想在错误修复时收到通知,您可以为它加注星标:

http://code.google.com/p/jnaerator/issues/detail?id=60

干杯

Olivier(JNAerator的作者)

答案 1 :(得分:1)

经过更多的研究,我确定我的问题是未命名的工会而不是匿名工会的问题。 JNAerator声称支持匿名工会,但我没有在未命名的工会上找到任何东西。根据我的经验,我会说它不支持未命名的工会。

附注:标准C不支持未命名的联合。有些编译器支持它但不是大多数。它是C ++的标准。

Anonymous Union:

typedef struct MY_STRUCTURE {
  int i;
  char c; 
  union { 
    My_Type1 var1; 
    My_Type2 var2; 
  }UnionName; 

}MY_STRUCTURE;

Anonymous和Unnamed Union:

typedef struct MY_STRUCTURE { 
  int i;
  char c;
  union { 
    My_Type1 var1; 
    My_Type2 var2; 
  }; 

}MY_STRUCTURE;

结论:标记解决方案

将标头中未命名的union更改为命名的union,然后JNAerate Java代码,然后将标题更改回原来的样式。就像Mark说的那样,它不会改变内存布局,所以你可以更改名称。

答案 2 :(得分:0)

添加名称不会更改内存布局,因此您可以更改名称,JNAerate Java代码(将适当地映射内存/结构),然后撤消更改。 JNA将结构映射到您的实际库不会受到添加名称的影响。

编辑:您的结果有点奇怪,因为JNAerator文档清楚地解决了anonymous types problem并且似​​乎表明它应该产生正确的结果。