Java 如何将PointerByReference地址传递给JNA中的结构

Java 如何将PointerByReference地址传递给JNA中的结构,java,structure,jna,jnaerator,Java,Structure,Jna,Jnaerator,我会有一个关于以下来源的问题,我简化了它,使它更容易理解 c代码 struct test { int test1; }; int create_context(test **context); int use_context(test *context); java代码 public static class test extends Structure { public int test1; public test() { super(); }

我会有一个关于以下来源的问题,我简化了它,使它更容易理解

c代码

struct test
{
int test1;
};

int create_context(test **context); 
int use_context(test *context);
java代码

public static class test extends Structure {
    public int test1;
    public test() {
        super();
    }
    public test()(Pointer p) {
        super(p);
    }
    protected List getFieldOrder() {
        return Arrays.asList("test1");
    }
    public test(int test1) {
        super();
        this.test1 = test1;
    }
    public static class ByReference extends test implements Structure.ByReference {

    };
    public static class ByValue extends test implements Structure.ByValue {

    };
}
public static native int create_context(PointerByReference context);
public static native int use_context(TestLibrary.test context);
我是这样用java访问结构的

    PointerByReference contextPointer = new PointerByReference();
    int status = INSTANCE.create_context(contextPointer);
    test context = new test(contextPointer.getValue());
    status = INCTANCE.use_context(context);
当我在VisualStudio中调试时,我看到,对于创建上下文和使用上下文,使用了不同的内存地址。 当我设置int test1值时,它是正确的,但我想知道,为什么上下文的地址不同。有人有主意吗?这不会导致记忆问题吗?或者知道我做错了什么吗?
感谢Valentina

您选择了通常使用
结构测试*
的约定,因此我们将对此进行讨论

您的本机代码需要如下所示:

int create_context(struct test **context) {
    *context = (struct test *)malloc(sizeof(test));
    // initialize here...
    return 0;
}
调用
create\u context
时,必须传入指针的地址:

struct test* test_ptr;

create_context(&test_ptr);

test_ptr->some_field = ...; // operate on your struct via pointer

按值(
struct test
)、按引用(
struct test*
)或引用地址(
struct test**
)使用结构时,保持笔直非常重要。无论您是在C还是在Java中使用,概念都是一样的。

您是否在问为什么
test**
类型的变量的值与
test*
类型的变量的值不同?是和否:)比如说,为什么地址不同,即使我使用相同的指针。知道吗?因为
test**
中的值是
test*
中值的地址。您还应该在
test(指针)
ctor中调用
Structure.read()。我按照你的建议试过了,但还是一样。通过进一步的调查,我发现测试上下文=新测试(contextPointer.getValue());已经通过了新地址。当我使用contextPointer.getPointer()时,它使用了正确的一个,但是出现了“java.lang.IllegalArgumentException:Structure超出了com.sun.jna.Structure.usemory(Structure.java:304)在com.sun.jna.Structure.usemory(Structure.java:282)上提供的内存边界”