2015-10-13 73 views
0

我正在創建JNA映射到OpenMAX C庫。一路走來,我也學習C.我遇到了一個結構,我不確定如何映射到,並且我一直無法找到任何資源來幫助。使用函數指針爲C結構創建JNA映射

下面是從結構的一個片段

typedef struct OMX_COMPONENTTYPE {  

    OMX_VERSIONTYPE nVersion; 

    OMX_ERRORTYPE (*SetParameter)(
       OMX_HANDLETYPE hComponent, 
       OMX_INDEXTYPE nIndex, 
       OMX_PTR pComponentParameterStructure); 
... 

「n版本」是一個正常的構件和在Java是容易可映射。

我的問題是功能指針SetParameter。 (我認爲就是這樣)

在Java中,結構體映射到jna.Structure類的子體。因爲這是一個類(不是接口),所以我不能定義一個沒有主體的方法頭,這是我如何映射方法的方法。

有誰知道這個映射應該是什麼樣子?

由於

回答

1

JNA使用Callback對象來表示函數指針,並且包括a description of callback usage

製作一個來自Callback的接口,它實現了一個匹配函數指針的方法。

public class MyStructure extends Structure {  

    public MyCallback callback; 

    public interface MyCallback extends Callback { 
     void invoke(); 
    } 
} 

如果您從本機內存中讀取結構,您將獲得一個可用於調用函數指針的代理對象。

從Java代碼,然後你可以分配領域的新值就像這樣:

MyStructure s = ...; 
s.callback = new MyCallback() { 
    public void invoke() { 
     // your callback implementation here 
    } 
}; 
+0

我一直在試圖弄清楚這一點對我的使用實例。我遇到了[這個文檔](https://jna.java.net/nonav/javadoc/overview-summary.html#callbacks),它看起來像你寫了很多個月前。希望你可以在「lib.init(funcs)」這行上說明一些事情。「本文檔中沒有其他地方定義了「lib」,並且我無法在JNA類中的任何位置找到init(對象)方法。 – Lowell

+0

這只是「調用初始化數據的本地庫函數」的一個存根。如果您調用填充結構的本地函數,那麼在函數返回時,回調字段將被正確設置。 – technomage