我正在使用GraalVm使用Java中的一个C库,并且我有一个字段(if_name),我不知道如何实现:
# define IFNAMSIZ 16
struct port_t
{
char if_name[IFNAMSIZ];
}
这是我目前的代码:
@CStruct("port_t")
interface Port extends PointerBase {
@CField("if_name")
WordPointer getIfName();
@CField("if_name")
void setIfName(WordPointer ifName);
}
使用WordPointer,我得到了以下错误编译:
Error: Type WordPointer has a size of 8 bytes, but accessed C value has a size of 16 bytes; to suppress this error, use the annotation @AllowNarrowingCast
我已经尝试过使用CCharPointer和CCharPointerPointer,但是它们的长度固定为8个字节,在编译时也出现了类似的错误。
有人能帮忙吗?提前感谢
发布于 2022-04-20 07:12:29
正如您已经猜到的,您需要获得这个字段的地址来操作它。您可以使用
@CStruct("port_t")
interface Port extends PointerBase {
@CFieldAddress("if_name")
CCharPointer addressOfIfName();
}
在这种情况下,有一个setter是没有意义的,因为您不能更改这个字段的地址。相反,您可以使用read
/write
方法的CCharPointer
。
你可能需要
@CConstant
static native int IFNAMSIZ();
也在某个地方。然后你就可以做这样的事情
String foo(Port p, String newIfName) {
UnsignedWord size = WordFactory.unsigned(IFNAMSIZ());
String oldIfName = CTypeConversion.toJavaString(p.addressOfIfName(), size);
CTypeConversion.toCString(newIfName, p.addressOfIfName(), size);
return oldIfName;
}
https://stackoverflow.com/questions/71921126
复制相似问题