我有以下的C函数:如何将jna的一个字节[]映射到void *缓冲区?
int read(int dev, void* buffer, unsigned int count)
这通常是在调用C这样的:
read(data->dev, data->buffer, 32000);
数据是一个结构,有以下几点:
typedef struct {
ssize_t dev;
char buffer[32000];
} DATA;
而且我有将其转换为java,以jna与以下内容:
public class Data{//not neccesary to extends of Structure, because is only used to package both variables together
public int dev;
public byte[] buffer;//in the constructor of the class set to 32000 elements
}
int read(int playdev, Buffer buffer, int count);
//clib is the class to connect with de C library
ByteBuffer bf = ByteBuffer.wrap(data.buffer);
clib.read(data.dev, bf , READ_SIZE);
当我做“clib.read”时,它给了我一个“java.lang.Error:无效的内存访问”
任何想法如何经历这个错误?我试过做一个: int vox_playstr_read(int playdev,指针缓冲区,int count);
与
ByteBuffer bf = ByteBuffer.wrap(data.buffer);
Pointer pbuf = Native.getDirectBufferPointer(bf);
clib.read(data.dev, pbuf, READ_SIZE);
,它给了我同样的结果。
请问,任何想法,使其工作?
您可以直接传递'byte []',使用NIO缓冲区或使用JNA'Memory'。 JNA支持所有三个作为缓冲区类型参数。 – technomage
请用您的*实际*代码更新您的问题。你不指出你如何初始化'buf'或'data.buffer';那很可能是你错误所在的地方。 – technomage
我编辑了答案。使用“buf”,我的意思是“bf”,它是相同的,我创建缓冲区,并用它构建de指针。我已经直接尝试了byte [],但没有使用Memory,我不知道你怎么说可以在这里应用。 – Selvaya