首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用GraalVm在Java中表示C字符数组

如何用GraalVm在Java中表示C字符数组
EN

Stack Overflow用户
提问于 2022-04-19 07:28:31
回答 1查看 114关注 0票数 0

我正在使用GraalVm使用Java中的一个C库,并且我有一个字段(if_name),我不知道如何实现:

代码语言:javascript
运行
复制
# define IFNAMSIZ 16

struct port_t
{
   char if_name[IFNAMSIZ]; 
}

这是我目前的代码:

代码语言:javascript
运行
复制
@CStruct("port_t")
interface Port extends PointerBase {
    
    @CField("if_name")
    WordPointer getIfName();

    @CField("if_name")
    void setIfName(WordPointer ifName);
}

使用WordPointer,我得到了以下错误编译:

代码语言:javascript
运行
复制
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个字节,在编译时也出现了类似的错误。

有人能帮忙吗?提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-20 07:12:29

正如您已经猜到的,您需要获得这个字段的地址来操作它。您可以使用

代码语言:javascript
运行
复制
@CStruct("port_t")
interface Port extends PointerBase {
    @CFieldAddress("if_name")
    CCharPointer addressOfIfName();
}

在这种情况下,有一个setter是没有意义的,因为您不能更改这个字段的地址。相反,您可以使用read/write方法的CCharPointer

你可能需要

代码语言:javascript
运行
复制
@CConstant
static native int IFNAMSIZ();

也在某个地方。然后你就可以做这样的事情

代码语言:javascript
运行
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71921126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档