我正在尝试让JNAerator从一个C共享库生成一些JNA支持的Java代码,一切都很好,除了它无法生成一个嵌套在结构中的未命名的联合。
示例:
typedef struct MY_STRUCTURE {
union {
My_Type1 var1;
My_Type2 var2;
};
}MY_STRUCTURE;如果我更改头文件,使联合有一个名称,它将工作。但是由于显而易见的原因,我不能仅仅改变头文件而不破坏我正在尝试使用的共享库。
除了将头文件和共享库更改为命名联合之外,还有其他解决方案吗?
发布于 2010-03-25 00:30:42
添加名称不会更改内存布局,因此您可以更改名称,对Java代码执行JNAerate (这将适当地映射内存/结构),然后撤消更改。添加名称不会影响JNA将结构映射到实际的库。
编辑:您的结果有点奇怪,因为JNAerator文档清楚地指出了anonymous types problem,并且似乎表明它应该产生正确的结果。
发布于 2010-04-15 01:51:59
这是JNAerator中的一个错误。我已经在JNAerator项目的跟踪器中输入了一个问题,所以如果你想在错误修复时得到通知,你可以启动它:
http://code.google.com/p/jnaerator/issues/detail?id=60
干杯
奥利维尔(JNAerator的作者)
发布于 2010-03-25 20:29:10
经过更多的研究,我确定我的问题是匿名联盟的问题,而不是匿名联盟的问题。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;结论: Marks解决方案
将报头中的未命名联合更改为命名联合,然后JNAerate Java代码,然后将报头更改回原来的状态。就像Mark说的,它不会改变内存布局,所以你可以更改名称。
https://stackoverflow.com/questions/2503183
复制相似问题