gpt4 book ai didi

java - Structure.ByValue 对象用作结构字段时无法正常工作

转载 作者:行者123 更新时间:2023-12-01 14:20:02 26 4
gpt4 key购买 nike

假设我有以下 C 结构体定义:

struct StructB {
int a;
int b;
};

struct StructA {
struct StructB *ref;
struct StructB value;
};

在 Java 中表示为:

public class StructA extends Structure implements Structure.ByReference {
public StructB.Reference ref;
public StructB value;

public StructA() {
ref = new StructB.Reference();
}

@Override
protected List<String> getFieldOrder() {
return Arrays.asList(new String[]{"ref", "value"});
}
}

public class StructB extends Structure {
public static class Reference extends StructB implements Structure.ByReference { }
public int a;
public int b;

@Override
protected List<String> getFieldOrder() {
return Arrays.asList(new String[]{"a", "b"});
}
}

如果在 Java 中分配一个新的 StructA 对象并设置其字段:

StructA sa = new StructA();
sa.ref.a = 1;
sa.ref.b = 2;
sa.value.a = 3;
sa.value.b = 4;

并将 sa 传递给 C 函数:

void printnest(struct StructA *s) {
printf("Printing structA...\n");
printf("\ts->ref->a: %d\n", s->ref->a);
printf("\ts->ref->b: %d\n", s->ref->b);
printf("\ts->value.a: %d\n", s->value.a);
printf("\ts->value.b: %d\n", s->value.b);
}

我得到以下输出:

Printing structA...
s->ref->a: 1
s->ref->b: 2
s->value.a: 3
s->value.b: 4

这是正确的。

但是,如果我在 StructB 中声明另一个静态类,如下所示:

public class StructB extends Structure {
public static class Reference extends StructB implements Structure.ByReference { }
public static class Value extends StructB implements Structure.ByValue { }
public int a;
public int b;

@Override
protected List<String> getFieldOrder() {
return Arrays.asList(new String[]{"a", "b"});
}
}

并声明 StructAvalue 字段显式为 Structure.ByValue,如下所示:

public class StructA extends Structure implements Structure.ByReference {
public StructB.Reference ref;
public StructB.Value value;

public StructA() {
ref = new StructB.Reference();
}

@Override
protected List<String> getFieldOrder() {
return Arrays.asList(new String[]{"ref", "value"});
}
}

再次调用 printnest 并传递 sa 时,我得到以下输出:

Printing structA...
s->ref->a: 1
s->ref->b: 2
s->value.a: 0
s->value.b: 0

因此,StructAStructB.Value 字段的字段不正确。为什么会发生这种情况?

最佳答案

不要使用Structure.ByValue。 JNA 假定结构类型字段首先采用按值语义; Structure.ByValue 标记实际上会触发特殊处理,该处理假设(可能过于广泛)它正在处理按值函数参数或返回值。

欢迎联系file an issue .

关于java - Structure.ByValue 对象用作结构字段时无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17690340/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com