1

我有以下 C 函数:

    int read(int dev, void* buffer, unsigned int count)

这通常在 C 中调用,例如:

    read(data->dev, data->buffer, 32000);

data 是一个结构,具有以下内容:

    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: Invalid memory access”

知道如何解决这个错误吗???

我试图做一个: int vox_playstr_read(int playdev, Pointer buffer, int count);

    ByteBuffer bf = ByteBuffer.wrap(data.buffer);
    Pointer pbuf = Native.getDirectBufferPointer(bf);
    clib.read(data.dev, pbuf, READ_SIZE);

它给了我同样的结果。

请问,有什么想法让它发挥作用吗?

4

2 回答 2

1

如果要设置任何初始数据,请尝试使用 ByteBuffer.allocateDirect 创建ByteBuffer ,然后使用 byteBuffer.put(..)。此外,重置缓冲区的位置,buffer.position(0)。

ByteBuffer bb = ByteBuffer.allocateDirect(values.length);
bb.put(values);
bb.position(0);

在此处阅读 Edwin 的回复,了解使用 allocateDirect 的原因。

于 2013-10-29T13:42:08.070 回答
1

technomage 对原帖的评论是完全正确的。明确地,在 Java 端,声明您计划使用的 JNA 接口方法:

int read(int playdev, byte[] buffer, int count);

clib.read(data.dev, data.buffer, READ_SIZE);

无需使用 Buffer 或 ByteBuffer。此外,根据读取函数是导出 __cdecl 还是 __stdcall,您的 JNA 接口应该extends Libraryextends StdCallLibrary分别。

于 2017-05-24T17:51:10.373 回答