gpt4 book ai didi

java - 从 Java 传递到 C 后未初始化的 JNA 结构数组

转载 作者:太空宇宙 更新时间:2023-11-03 23:53:59 25 4
gpt4 key购买 nike

我一直在使用 JNA 相对成功地从 Java 调用 native 函数到我编写的小型 C 库。一旦掌握了结构映射、内存管理和按引用传递的技巧,将结构或指针从一个传递到另一个就非常有效。

我现在正尝试将结构数组从 Java 传递到 C。这是该结构的 C 代码:

typedef struct key {
int length;
void *data;
} key_t;

我在 Java 中有匹配的定义:

public class Key extends Structure {

public int length;
public Pointer data;

public Key() {
this.setFieldOrder(new String[] {"length", "data"});
}

public void setAsLong(long value) {
this.length = 8;
this.data = new Memory(this.length);
this.data.setLong(0, value);
}

public long longValue() {
return this.data != null ? this.data.getLong(0) : Long.MIN_VALUE;
}
};

如果我理解文档和我在线阅读的内容,我需要通过在 Java 端执行以下操作来将我的数组创建为连续的内存部分:

Key[] keys = new Key().toArray(2);
for (int i=0; i<2; i++) {
k.setAsLong(42+i);
}

到目前为止一切顺利。如果我使用 Structure.toString() 在 Java 中转储每个 Key 结构的内容,那么这里的所有内容都符合预期。请注意,当我将单个 Key 结构从 Java 传递到 C 时,关于设置为长值、为键的内容分配内存等的代码工作正常。所以在这里我将我的数组传递给我的本地通过使用指向数组第一个元素的指针函数:

instance.foo(keys[0].getPointer(), keys.length);

我的C函数当然是这样定义的:

void foo(key_t *keys, size_t count) {
...;
}

数组正确到达:C端的keys指针与Java中的keys[0].getPointer()地址相同,可惜成员数组中的每个结构都是 0/NULL,正如 GDB 所指出的:

(gdb) print keys
$1 = (key_t *) 0x7fd7e82389e0
(gdb) print keys[0]
$2 = {length = 0, data = 0x0}

在这一点上,老实说,我不知道发生了什么。正如我所说,如果我只通过一个结构,它工作正常,但这里不行。我能看到的唯一区别是 Java native 方法签名,它使用 Pointer 而不是 Key[] 但是当我使用数组时,我得到:

IllegalArgumentException: [Lfoo.bar.Key; is not a supported argument type (in method foo ...

谢谢

最佳答案

如果您传递一个 Pointer 值,JNA 不知道您实际上传递的是一个 Structure 或它们的数组,这取决于您确保您在 native 调用之前调用 Structure.write() 并在 native 调用之后调用 Structure.read()

如果您传递 StructureStructure[],那么 JNA 将自动处理同步。对于 Structure,JNA 使用内部簿记来确定您传递的结构是否位于结构数组的开头。

关于java - 从 Java 传递到 C 后未初始化的 JNA 结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12865130/

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