JNA 如何包装用C++编写的接口
JNA How to wrap interface written in C++
我已经知道如何包装结构,但我需要一些接口方面的帮助。 我要包装的接口是IImageList。
但是我现在知道如何从中创建Java类。
这可以完成,但您需要访问头文件。 IImageList 文档告诉您这来自 commoncontrols.h。 有关以下讨论,请参阅此源文件。
虽然不是强制性的,但对于组织,您需要为头文件创建一个 Java 类,例如CommonControls.java
. 在其中为接口创建一个类,扩展 JNA 的Unknown
类并添加所需的方法。这些方法应使用_invokeNativeObject()
(或void
或int
变体(。 这里的关键点是您需要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撰写。
相关文章:
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- Visual C++GC接口如何启用它以及要包含哪个库
- Windows.h与GLFW.h的接口
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 提供与TMP和SFINAE的通用接口
- 为重写std::exception的库生成swig接口时出错
- 内联如何影响模块接口中的成员函数
- COM 接口 c# 封送数组数组
- 如何在 SCIP C++ 接口中获取 MILP 约束矩阵中的系数值
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 如何绑定 C++ gRPC 客户端的网络接口
- 模板化接口 - 创建一个泛型模板类以返回任何容器
- 如何从实现接口的模板化类实例访问结构
- 带有进度表的 curl 多接口程序
- 设计帮助 - 为不同类型的消息处理通用接口的设计模式
- 我可以在具有一个标头和一个接口的 cpp 文件中有多个嵌入吗?
- 类接口,可以创建N个方法
- 类具有相同的接口,但参数的类型不同
- 如何与 Cheerp/js 中的 extern 变量接口?
- 如何使用现代 CMake 安装捆绑的接口依赖项?