我已经知道如何包装 Structure ,但我需要一些关于接口(interface)的帮助。 我要包装的接口(interface)是 IImageList .
但我现在知道如何从中创建一个 java 类了。
最佳答案
这可以完成,但您需要访问头文件。 IImageList文档告诉你这来自 commoncontrols.h .请参阅此源文件以进行以下讨论。
虽然不是强制性的,但为了组织,您需要为头文件创建一个 Java 类,例如 CommonControls.java
。在里面为接口(interface)创建一个类,扩展 JNA 的 Unknown
类并添加所需的方法。这些方法应该使用 _invokeNativeObject()
(或 void
或 int
变体)。这里的关键点是您需要 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/