如何使用 GraalVm 在 Java 中表示 C 字符数组
How to represent a C char array in Java with GraalVm
我在 Java 中使用 GraalVm 中的 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 个字节,我在编译时遇到了类似的错误。
有人可以帮忙吗?
提前致谢
正如您已经猜到的那样,您需要获取该字段的地址才能对其进行操作。
您可以使用
@CStruct("port_t")
interface Port extends PointerBase {
@CFieldAddress("if_name")
CCharPointer addressOfIfName();
}
在这种情况下,setter 没有意义,因为您无法更改该字段的地址。相反,您可以使用 CCharPointer
.
的 read
/write
方法
您可能需要
@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;
}
我在 Java 中使用 GraalVm 中的 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 个字节,我在编译时遇到了类似的错误。
有人可以帮忙吗? 提前致谢
正如您已经猜到的那样,您需要获取该字段的地址才能对其进行操作。 您可以使用
@CStruct("port_t")
interface Port extends PointerBase {
@CFieldAddress("if_name")
CCharPointer addressOfIfName();
}
在这种情况下,setter 没有意义,因为您无法更改该字段的地址。相反,您可以使用 CCharPointer
.
read
/write
方法
您可能需要
@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;
}