如何使用 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;
}