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

JNA How to wrap interface written in C++

本文关键字:接口 C++ 包装用 JNA      更新时间:2023-10-16

我已经知道如何包装结构,但我需要一些接口方面的帮助。 我要包装的接口是IImageList。

但是我现在知道如何从中创建Java类。

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

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

例如,请参阅我如何在此 Wbemcli.java 类中实现来自 wbemcli.h 的多个接口。 一个示例实现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);
}
}

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

这最终成为解决方案:

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

解决方案来自问题;由Mrmarnic撰写。