我试图让Jnaerator从C共享库生成一些JNA支持的JAVA代码,一切都很好,除了它未能生成一个嵌套在结构内的未命名的联合。

例子:

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

}MY_STRUCTURE;

如果我更改标题以使工会有一个名称,它将起作用。但是出于明显的原因,我不能仅仅在不打破我要使用的共享库的情况下更改标头。

除了更改标头文件和共享库以命名Union以外,还有其他解决方案吗?

有帮助吗?

解决方案

添加名称不会更改内存布局,因此您可以更改名称,jna jna java ofer java代码(将适当地映射内存/结构),然后删除更改。 JNA将结构映射到您的实际库不会通过添加名称来影响。

编辑: :您的结果有些奇怪,因为Jnaerator文档清楚地解决了 匿名类型问题 似乎表明它 应该 产生正确的结果。

其他提示

这是jnaerator中的一个错误。我在JNAerator Project的跟踪器中输入了一个问题,因此,如果您想在修复错误时被通知,则可以播放它:

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

干杯

奥利维尔(Jnaerator的作者)

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

旁注:标准C中不支持未命名的工会。一些编译器支持它,但最多。它是C ++的标准配置。

匿名联盟:

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

}MY_STRUCTURE;

匿名和不愿透露姓名的联盟:

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

}MY_STRUCTURE;

结论:标记解决方案

将标题中未命名的联盟更改为一个指定的工会,然后将Java代码纳入ja na命名,然后将标题返回到它的状态。就像马克所说的那样,它不会更改内存布局,因此您可以更改名称。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top