gpt4 book ai didi

java - JNA:将结构指针设置为 NULL

转载 作者:搜寻专家 更新时间:2023-11-01 00:55:12 27 4
gpt4 key购买 nike

我开始用JNA在电脑的RS485接口(interface)上和一个设备通讯。令我惊讶的是,我很快就取得了不错的成绩。但是现在我被一个简单的问题困住了。我使用的库接受一个指向结构指针的指针。实际签名是

func(Struct1 **, Struct2 **, Struct3 *, Struct4 *, long)

现在要指示第一个参数的大小,库希望最后一个指针为 NULL 指针。这就是失败的原因。以下代码是我到目前为止尝试过的:

    Struct1.ByReference[] s = (Struct1.ByReference[]) new Struct1.ByReference().toArray(size);
int pos = 0;

// ...
// for loop to set the s[pos] struture values
for(pos = 0; pos < size - 1; pos++)
// ...

// Now set the last array element to a null pointer to indicate end-of-list
s[pos].getPointer().setPointer(0, null);// Following does not work: results in zero memoried structure
s[pos] = null; // Following does not work wither: NullPointerException at com.sun.jna.Structure.autoWrite

编辑 1

s[pos] = new Struct1.ByReference(Pointer.NULL); // results in zero memoried structure as well

编辑 2

根据technomage的问题。如果我要编写 C 代码,它可能看起来像这样:

Struct1 **s = malloc(n * sizeof(Struct1*));

for(int i=0; i<n; i++)
{
if(i == n -1)
{
s[i] = NULL;
}
else
{
s[i] = malloc(sizeof(Struct1));
s[i].bla = value;
....
}
}

但请注意:我对 C/C++ 不是很熟练。我认为 Java 是我的领域。

有人遇到过类似的问题吗?也许我只是只见树木不见森林......

提前致谢。

最佳答案

JNA 中的结构是指针,因此您在这里真正需要的是一个指向(指向一个)结构​​的指针,它是一个 PointerByReference —— 在您的例子中,是一个结构的数组。

根据上面的代码示例,您将创建结构数组,比 n 少一个:

Struct1[] struct1Array = new Struct1[n-1];

这仅为数组分配 Java 内存。

接下来您将实例化并写入您对 native 内存所做的更改:

for (int i = 0; i < n-1; i++) {
struct1Array[i] = new Struct1();
struct1Array[i].bla = value;
struct1Array[i].write();
}

new Struct1() 为这些结构分配本地内存。也可以使用 Structure.toArray() 方法来做到这一点;我有意以更手动和更底层的方式执行此操作,以试图弄清楚发生了什么。

然后您将创建一个相应的PointerByReference 数组来保存指向这些结构的指针。您将为 null 添加一个额外的元素:

PointerByReference[] pbrArray = new PointerByReference[n];

同样,这只是java端的分配。然后用指向结构指针的指针填充它,从 Structure.getPointer() 方法获得:

for (int i = 0; i < n-1; i++) {
pbrArray[i] = new PointerByReference(struct1Array[i].getPointer());
}
pbrArray[n - 1] = new PointerByReference(Pointer.NULL);

这里的new PointerByReference()为指针本身分配了本地内存,它指向你之前分配的本地结构。

根据我对您最初问题的理解,您会将此 PointerByReference 数组传递给您的函数,这可能会更新您的结构。

由于您以这种方式创建了两个数组,因此您可以通过数组索引跟踪它们的对应关系。您可能必须遍历结构数组并将 native 内存 read() 迭代到 Java 端结构中,以对其进行进一步处理。通常,当您直接使用传递给方法的结构时,它们会自动写入和自动读取,但是当使用 PointerByReference 间接引用结构时,JNA 就不那么友好了。

作为通过相应索引跟踪两个数组的替代方法,您可以“忘记”初始结构分配并稍后使用数组上的 PointerByReference.getValue() 方法恢复它以恢复指针到结构的内存中,然后在其构造函数中使用该指针实例化一个新结构(例如 new Struct1(pbr.getValue()) 调用 super()那个指针)。

关于java - JNA:将结构指针设置为 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36151245/

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