1

我会对以下来源有疑问,我对其进行了简化以使其更容易理解。

c代码

struct test
{
int test1;
};

int create_context(test **context); 
int use_context(test *context);

爪哇代码

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);

当我在 Visual Studio 中调试它时,我已经看到,对于 create_context 和 use_context 使用了不同的内存地址。当我设置 int test1 值时,它是正确的,但我想知道,为什么上下文的地址不同。有人有想法吗?这不会导致内存问题吗?或者任何想法我做错了什么?谢谢瓦伦蒂娜

4

1 回答 1

1

您选择了通常使用的约定struct test*,因此我们将使用它。

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

int create_context(struct test **context) {
    *context = (struct test *)malloc(sizeof(test));
    // initialize here...
    return 0;
}

当你调用 时create_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,概念都是相同的。

于 2013-03-24T23:11:58.797 回答