2013-10-29 122 views
1

我有以下的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); 

,它給了我同樣的結果。

請問,任何想法,使其工作?

+0

您可以直接傳遞'byte []',使用NIO緩衝區或使用JNA'Memory'。 JNA支持所有三個作爲緩衝區類型參數。 – technomage

+0

請用您的*實際*代碼更新您的問題。你不指出你如何初始化'buf'或'data.buffer';那很可能是你錯誤所在的地方。 – technomage

+0

我編輯了答案。使用「buf」,我的意思是「bf」,它是相同的,我創建緩衝區,並用它構建de指針。我已經直接嘗試了byte [],但沒有使用Memory,我不知道你怎麼說可以在這裏應用。 – Selvaya

回答

1

嘗試創建與ByteBuffer.allocateDirect ByteBuffer,然後使用byteBuffer.put(..)如果你想設置任何初始數據。此外,重置緩衝區的位置,buffer.position(0)。

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

閱讀Edwin的回覆here爲了使用allocateDirect。

+0

我試過用ByteBuffer buf = ByteBuffer.allocateDirect(32000); \t \t \t buf.put(data.buffer);和結果是​​相同的「java.lang.Error:無效的內存訪問」 – Selvaya

+0

..你重置位置爲0,與buf.position(0)和data.buffer.length == 32000?你可以用一個簡單的函數來測試它,它會得到這樣一個指針,然後嘗試在那裏放置幾個字節,在本地函數返回之後,你可以在java端檢查它。 – radical

+0

隨着你的修改,結果和以前一樣: – Selvaya

1

technomage對原帖的評論完全正確。明確地說,在Java端,聲明你JNA接口方法,你打算使用它:

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

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

無需使用緩衝區或字節緩衝區。另外,根據讀取函數是否導出__cdecl或__stdcall,您的JNA接口應分別爲extends Libraryextends StdCallLibrary