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;

そして、これを次のようにjnaを使用してJavaに変換しました。

    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);

allocateDirect を使用する理由については、ここでEdwin の返信をお読みください。

于 2013-10-29T13:42:08.070 に答える