我正在尝试让JNAerator从C共享库生成一些JNA支持的Java代码,一切都很好,除了它无法生成嵌套在结构中的未命名联合。
示例:
typedef struct MY_STRUCTURE {
union {
My_Type1 var1;
My_Type2 var2;
};
}MY_STRUCTURE;
如果我更改标题以使联合具有名称,它将起作用。但是出于显而易见的原因,我不能在不破坏我正在尝试使用的共享库的情况下更改标题。
除了将头文件和共享库更改为命名联合之外的任何其他解决方案?
答案 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并且似乎表明它应该产生正确的结果。