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()
(或 void
或 int
变体)。这里的关键点是您需要 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。
我已经知道如何包装 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()
(或 void
或 int
变体)。这里的关键点是您需要 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);
}
}
解决方案来自