gpt4 book ai didi

java - 有没有有效的方法使用 JNA 读取动态大小共享内存段?

转载 作者:行者123 更新时间:2023-11-30 15:15:28 32 4
gpt4 key购买 nike

我试图找到以结构数组形式读取共享内存的有效方法(在 C 中):

typedef struct the_struct {
int id;
int data;
} the_c_struct;
static the_c_struct *the_struc_ptr = NULL;

目前,我使用以下 JNA Structure 代码从共享内存中检索数据:

public class MyCStruc extends Structure {

public int id;
public int data;

@Override
protected List getFieldOrder() {
return Arrays.asList(new String[]{"id", "data"});
}

@Override
public void useMemory(Pointer m, int offset) {
super.useMemory(m, offset);
super.read();
}

@Override
public void useMemory(Pointer m) {
super.useMemory(m);
super.read();
}

}

并使用 shmgetshmat 的 native 实现读取共享内存:

memId = NativeLib.INSTANCE.shmget(0x999, memSize, 0);
CStructPtr = NativeLib.INSTANCE.shmat(memId, null, 0);

MyCStruc cs=new MyCStruc();
for (int i=0;i<CStructArraySize;i+=8) {
cs.useMemory(CStructPtr,i);
// to read a record of struct array
// do something with the data
}

上面的代码实际上是有效的,但我想我可以做一些更有效的事情来读取结构数组?对吗?

注意:结构体数组的大小是动态的,但我可以设法获取共享内存的大小。

最佳答案

这里不用担心 Structure,只需让 shmat 调用返回 Pointer 并使用 Pointer.getInt( 0) 获取 ID,Pointer.getInt(4) 获取 data 字段。

您甚至可以使用 Native.getDirectBufferPointer() 为您提供一个 NIO 缓冲区,您可以将其传递给其他 Java 代码。

如果您正在读取连续分配的struct数组,那么您应该使用基于Pointer的构造函数创建第一个Structure,然后在该实例上调用 Structure.toArray(size) 来加载完整数组。

Pointer p = lib.shmat();
MyCStruc s = new MyCStruc(p);
MyCStruc[] array = (MyCStruc[])s.toArray(size);

和构造函数:

public class MyCStruc extends Structure {
public MyCStruc(Pointer p) {
super(p);
read();
}
}

关于java - 有没有有效的方法使用 JNA 读取动态大小共享内存段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33605620/

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