题
我试图让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命名,然后将标题返回到它的状态。就像马克所说的那样,它不会更改内存布局,因此您可以更改名称。
不隶属于 StackOverflow