java - JNA 如何包装用 C++ 编写的接口(interface)

标签 java c++ parsing wrapper

我已经知道如何包装 Structure ,但我需要一些关于接口(interface)的帮助。 我要包装的接口(interface)是 IImageList .

但我现在知道如何从中创建一个 java 类了。

最佳答案

这可以完成,但您需要访问头文件。 IImageList文档告诉你这来自 commoncontrols.h .请参阅此源文件以进行以下讨论。

虽然不是强制性的,但为了组织,您需要为头文件创建一个 Java 类,例如 CommonControls.java。在里面为接口(interface)创建一个类,扩展 JNA 的 Unknown类并添加所需的方法。这些方法应该使用 _invokeNativeObject() (或 voidint 变体)。这里的关键点是您需要 vtableId。这是您返回到前面列出的头文件的地方。在 header 中找到 IImageListVtbl 条目(位于第 322 行)并计算方法(从 0 开始)以找到与您想要的方法对应的 ID。 vtableID = 0 将是 QueryInterface。 ID 1 是 AddRef。等等。

例如,请参阅我如何从 this Wbemcli.java class 中的 wbemcli.h 实现多个接口(interface)。 .一个例子实现了 IEnumWbemClassObject::Next方法如下:

class IEnumWbemClassObject extends Unknown {

    public IEnumWbemClassObject(Pointer pvInstance) {
        super(pvInstance);
    }

    public HRESULT Next(int lTimeOut, int uCount, PointerByReference ppObjects, IntByReference puReturned) {
        // Next is 5th method of IEnumWbemClassObjectVtbl in
        // WbemCli.h
        return (HRESULT) _invokeNativeObject(4,
                new Object[] { getPointer(), lTimeOut, uCount, ppObjects, puReturned }, HRESULT.class);
    }
}

您可以在同一个类中添加多个(或所有)方法。

关于java - JNA 如何包装用 C++ 编写的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51968763/

相关文章:

java - 在 Java 中将 Object 转换为 Long 哪种方式更理想?

validation - Haskell IO,在同一行中获取两个输入并进行验证

Python 3 替换字符串正则表达式

python - 如何将多个列表转换为python中的字典?

c# - AES 负字节

java - GL.createCapability 抛出 NullPointerException

java - 返回接口(interface)类型对象的方法

c++ - 将 unique_ptr 的内容复制到未知派生类

c++ - 堆分配如何影响硬件缓存命中率?

c++ - 将 char 指针值等同于某个 char 时出现段错误