JNA 如何包装用 C++ 编写的接口

JNA How to wrap interface written in C++

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

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

这可以完成,但您需要访问 header 文件。 IImageList documentation tells you this comes from commoncontrols.h。下面的讨论参考这个源文件。

虽然不是强制性的,但对于组织,您需要为 header 文件创建一个 Java class,例如 CommonControls.java。在其中为接口创建一个 class,扩展 JNA 的 Unknown class and add the method(s) you want. The methods should use _invokeNativeObject()(或 voidint 变体)。这里的关键点是您需要 vtableId。这是您返回到前面列出的 header 文件的地方。在 header 中找到 IImageListVtbl 条目(它在第 322 行)并计算方法(从 0 开始)以找到哪个 ID 对应于您想要的方法。 vtableID = 0 将是 QueryInterface。 ID 1 是 AddRef。等等。

举个例子,看看我是如何在 this Wbemcli.java class. One example implements the IEnumWbemClassObject::Next 方法中实现 wbemcli.h 的几个接口的:

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);
    }
}

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

这最终成为解决方案:

class IImageList extends Unknown {
    public IImageList(Pointer pvInstance) {
        super(pvInstance);
    }

    public WinNT.HRESULT GetIcon(int i, int flags, PointerByReference picon) {
        return (WinNT.HRESULT) _invokeNativeObject(10,
                new Object[]{this.getPointer(), i, flags, picon},WinNT.HRESULT.class);
    }
}

解决方案来自 ; written by mrmarnic