2015-10-13 98 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