【问题标题】:Create JNA mapping for C struct with function pointer使用函数指针为 C 结构创建 JNA 映射
【发布时间】:2016-01-11 11:10:23
【问题描述】:

我正在创建到 OpenMAX C 库的 JNA 映射。在此过程中,我也在学习 C。我遇到了一个我不确定如何映射到的结构,并且我无法找到任何资源来提供帮助。

这是结构体中的一个 sn-p

typedef struct OMX_COMPONENTTYPE {    

    OMX_VERSIONTYPE nVersion;

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

"nVersion" 是一个普通成员,在 java 中很容易映射。

我的问题在于功能指针 SetParameter。 (我认为就是这样)

在 Java 中,结构被映射到 jna.Structure 类的子类。因为这是一个类(不是接口),所以我无法定义没有主体的方法头,这就是我映射方法的方式。

有人知道这个映射应该是什么样子吗?

谢谢

【问题讨论】:

    标签: java c struct jna


    【解决方案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
        }
    };
    

    【讨论】:

    • 我一直在尝试为我的使用实例解决这个问题。我遇到过this document,它看起来像是你在很多个月前写的。希望您能对“lib.init(funcs);”这一行有所了解。本文档中没有其他地方定义了“lib”,我在 JNA 类的任何地方都找不到 init(object) 方法。
    • 这只是“调用初始化数据的本机库函数”的存根。如果您调用填充结构的本机函数,则回调字段将在函数返回时正确设置。
    猜你喜欢
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多