Seb*_*ötz 5 java null pointers jna
我开始使用JNA与计算机的RS485接口上的设备进行通信.令我惊讶的是,我很快就取得了良好的效果.但现在我被一个简单的问题所困扰.我使用的库接受指向struct指针的指针.实际的签名是
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
Run Code Online (Sandbox Code Playgroud)
编辑1
s[pos] = new Struct1.ByReference(Pointer.NULL); // results in zero memoried structure as well
Run Code Online (Sandbox Code Playgroud)
编辑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;
....
}
}
Run Code Online (Sandbox Code Playgroud)
但请注意:我对C/C++不是很熟练.我认为Java是我的域名.
有人有过类似的问题吗?也许我只是没有看到树木...
提前致谢.
JNA 中的结构是指针,因此您真正需要的是一个指向(指向)结构的指针,PointerByReference在您的情况下,它是一个它们的数组。
根据上面的代码示例,您将创建结构数组,比 n 少 1:
Struct1[] struct1Array = new Struct1[n-1];
Run Code Online (Sandbox Code Playgroud)
这仅为数组分配 Java 内存。
接下来,您将实例化并对本机内存所做的更改写入:
for (int i = 0; i < n-1; i++) {
struct1Array[i] = new Struct1();
struct1Array[i].bla = value;
struct1Array[i].write();
}
Run Code Online (Sandbox Code Playgroud)
为这些结构分配new Struct1()本机端内存。也可以使用该Structure.toArray()方法来执行此操作;我有意以更多的手动和低级方式进行操作,以试图弄清楚发生了什么。
然后,您将创建一个相应的PointerByReference数组来保存指向这些结构的指针。您将为 null 添加一个额外的元素:
PointerByReference[] pbrArray = new PointerByReference[n];
Run Code Online (Sandbox Code Playgroud)
再次强调,这只是 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);
Run Code Online (Sandbox Code Playgroud)
这里new PointerByReference()为指针本身分配本机端内存,该指针指向您之前分配的本机端结构。
根据我对您最初问题的理解,您将将此PointerByReference数组传递给您的函数,这可能会更新您的结构。
由于您以这种方式创建了两个数组,因此您可以通过数组索引来跟踪它们的对应关系。您可能必须遍历结构体数组和read()本机内存到 Java 端结构体中才能对其进行进一步处理。通常,当您直接使用传递给它们自动写入和自动读取的方法的结构时,但是当使用PointerByReference间接引用结构时,JNA 就不那么友好了。
作为通过相应索引跟踪两个数组的替代方法,您可以“忘记”初始结构分配,并稍后使用PointerByReference.getValue()数组上的方法恢复它以恢复指向结构内存的指针,然后使用该结构实例化一个新结构其构造函数中的指针(例如new Struct1(pbr.getValue()),使用该指针调用super())。
| 归档时间: |
|
| 查看次数: |
999 次 |
| 最近记录: |