c++源码的数据结构复杂的情况下,java如何调用dll?
本帖最后由 空无清 于 2019-11-30 08:48 编辑本来有个C#工程是可以完美调用这个dll的,但是上面准备废弃C#工程,要求用java实现调用,所以就打算用jna来调用dll,但是C++源码的数据结构挺复杂的,自己根据C++源码排除用不上的部分写了个精简版的头文件,但是数据结构仍然比较复杂。精简版C++头文件如下:
extern "C" {
typedef unsigned inthuint32;
enum HErrorCode
{
kSuccess = 0,
kInvalidInit,
kInvalidParam,
kMallocMemoryFail,
kSetParentHandleFail,
kInvalidRVFFile,
kSaveRVFFileFail,
kInvalidRTFFile,
kInvalidTxtFile,
kInvalidImgFile,
};
/** @enum HTextKey
*@brief作为功能key, 每个key都有与之对应的value, 每项具有描述.
*/
enum HTextKey
{
kTextFontName,///< 设置文字字体类型, value类型为wchar_t *, 表示文字字体名.
kTextFontSize,///< 设置文字字体大小, value类型为huint32 *, *value表示字体大小值.
/**
*@brief设置文字字体颜色, value类型为huint32 *, *value表示字体颜色.
* 颜色空间为ABGR, 其中忽略alpha通道. 例如: 0xff红色, 0xff00绿色, 0xff0000蓝色.
*/
kTextColor,
/**
*@brief设置文字背景颜色, value类型为huint32 *, *value表示字体颜色.
* 颜色空间为ABGR, 其中alpha通道值为0. 例如: 0xff红色, 0xff00绿色, 0xff0000蓝色.
* 取消文字背景值为: 0x1FFFFFFF.
*/
kTextBackgroundColor,
kTextHAlignment, ///< 设置文字水平对齐方式, value类型为huint32 *, *value表示水平对齐方式. 请参考HTextHAlignment定义.
kTextCharSpace, ///< 文字间距, value类型为huint32 *, *value表示字间距大小, 单位为像素. 取值范围, 步进为1.
kTextLineSpace, ///< 文字行间距, value类型为huint32 *, *value表示行间距, 单位为百分比. 取值范围, 步进为5.
kTextBoldFlag, ///< 粗体, value类型为huint32 *,*value表示粗体标志. 1表示设置粗体, 0表示取消粗体.
kTextItalicFlag, ///< 斜体, value类型为huint32 *,*value表示斜体标志. 1表示设置斜体, 0表示取消斜体.
kTextUnderlineFlag, ///< 下划线, value类型为huint32 *,*value表示下划线标志. 1表示设置下划线, 0表示取消下划线.
/**
*@brief设置编辑器背景颜色, value类型为huint32 *, *value表示字体颜色.
* 颜色空间为ABGR, 其中alpha通道值为0. 例如: 0xff红色, 0xff00绿色, 0xff0000蓝色.
* 取消文字背景值为: 0x1FFFFFFF.
*/
kEditBackgroundColor,
kEditBackgroundTransparent,///< 编辑器背景色透明标志, value类型为huint32 *, *value表示透明标志. 1表示透明, 0表示不透明.
kEditBackgroundPicture, ///< 设置编辑器背景图片, 暂时不支持.
kEditVAlignment, ///< 设置段落垂直对齐方式, value类型为huint32 *, *value表示段落垂直对齐方式. 请参考HEditVAlignment定义.
kEditUndo, ///< 回退, 设置时忽略value取值. 回调时value类型为huint32 *,*value表示是否可以撤销标志. 1表示可以撤销, 0表示不可以撤销
kEditRedo, ///< 重做, 设置时忽略value取值. 回调时value类型为huint32 *,*value表示是否可以重做标志. 1表示可以重做, 0表示不可以重做
kEditCut, ///< 剪切, 设置时忽略value取值. 回调时value类型为huint32 *,*value表示是否可以剪切标志. 1表示可以剪切, 0表示不可以剪切
kEditCopy, ///< 拷贝, 设置时忽略value取值. 回调时value类型为huint32 *,*value表示是否可以拷贝标志. 1表示可以拷贝, 0表示不可以拷贝
kEditPaste, ///< 粘贴, 设置时忽略value取值. 回调时value类型为huint32 *,*value表示是否可以粘贴标志. 1表示可以粘贴, 0表示不可以粘贴
kPageInfoBack, ///< 页面信息反馈, value类型为huint32 *, value表示页面总数, value表示当前页面数.
kInsertPicture, ///< 插入图片, 忽略value取值.
kPictureResize, ///< 图片大小, value类型为huint32 *, value表示宽度, value表示高度. (单位: 像素)
kInsertTable, ///< 插入表格, 忽略value取值.
kTableProperties, ///< 表格属性, value类型为HTableProperties,如果为NULL,表示外部调用修改属性
kTablePropOperate, ///< 表格操作,value类型为HTablePropOperate
kTextChnaged, ///< 内容改变, 忽略value取值.
kRButtonDown, ///< 右键事件, 忽略value取值.
kRightToLeft, ///< 处理阿拉伯文字的方向问题, value类型为huint32 *, 0表示不启用, 1表示启用.
};
#define TranslateItemCount 31
/** @enum HMenuItemKey
*@brief作为菜单key
*/
enum HMenuItemKey
{
kMenuUndo = 0, ///< 撤销
kMenuRedo, ///< 恢复
kMenuCut, ///< 剪切
kMenuCopy, ///< 复制
kMenuPaste, ///< 粘贴
kMenuDelete, ///< 删除
kMenuSelAll, ///< 选择全部
kMenuInsertImage, ///< 插入图片
kMenuResizeImage, ///< 调整图片大小
kMenuInsertTable, ///< 插入表格
kMenuTableProp, ///< 表格属性
kMenuRow, ///< 行菜单
kMenuInsertRowAbove, ///< 上方插入行
kMenuInsertRowBelow, ///< 下方插入行
kMenuDeleteRow, ///< 删除行
kMenuColumn, ///< 列菜单
kMenuInsertColLeft, ///< 左边插入列
kMenuInsertColRight, ///< 右边插入列
kMenuDeleteColumn, ///< 删除列
kMenuMergeCells, ///< 合并单元格
kMenuSplitCell, ///< 拆分单元格
kMenuSplitVert, ///< 垂直拆分
kMenuSplitHort, ///< 水平拆分
kMenuVertAlign, ///< 垂直对齐菜单
kMenuVAlignTop, ///< 顶端对齐
kMenuVAlignBottom, ///< 底端对齐
kMenuVAlignCenter, ///< 居中对齐
kMenuUnmerge, ///< 合并恢复菜单
kMenuUnmergeRows, ///< 合并恢复行
kMenuUnmergeColumns, ///< 合并恢复列
kMenuUnmergeAll, ///< 合并恢复全部
};
enum HEditTableStatus
{
kNone = 0x00000000, ///< 无表格.
kTable = 0x00000001, ///< 有表格.
kTableSelected = 0x00000002, ///< 有表格,并且选中.
kTableSelRectangular = 0x00000004, ///< 有表格,编辑单元格.
kTableCanMergeSelected = 0x00000008, ///< 有表格,并且可以合并单元格操作.
};
/** @enum HTextHAlignment
*@brief水平对齐方式.
*/
enum HTextHAlignment
{
kLeftAlignment, ///< 水平左对齐.
kHCenterAlignment, ///< 水平居中对齐.
kRightAlignment, ///< 水平右对齐.
kJustifyAlignment, ///< 水平分散对齐.
};
/** @enum HEditVAlignment
*@brief段落垂直对齐方式.
*/
enum HEditVAlignment
{
kBottomAlignment, ///< 垂直向下对齐.
kVCenterAlignment,///< 垂直居中对齐.
kTopAlignment, ///< 垂直置顶对齐.
};
enum HImageType
{
kMemoryFile,
kLocalFile,
};
enum HSpaceType
{
kNonSpace,
kLeftSpace,
kRightSpace,
kTopSpace,
kBottomSpace,
};
enum HFixedType
{
kFixedHeight,
kFixedWidth,
kLineHeight,
kLineWidth,
};
#pragma pack(1)
typedef struct HGenImageParam
{
HImageTypetype;
huint32 pageWidth;
huint32 pageHeight;
bool mulImageFlag;
HFixedTypefixedType;
HSpaceTypespaceFlag;
} HGenImageParam;
typedef struct HImageInfo
{
HImageTypetype;
huint32 dataCount;
union {
wchar_t * filename;///< 调用者传入
char *bytes; ///< 类库提供.
};
} HImageInfo;
typedef struct HInsertImageInfo
{
const char* filename;
huint32 imageWidth;
huint32 imageHeight;
} HInsertImageInfo;
typedef struct HContextInfo
{
void* stream;///< 文本控件生成的文件流对象
void* memory;///< 文件流
huint32 size;///< 文件流内容的大小
} HContextInfo;
typedef struct HDefFontInfo
{
huint32 size; ///< 默认字体大小
char* name; ///< 默认字体名字
} HDefFontInfo;
typedef struct HTableProperties
{
huint32 row; ///< 行数
huint32 col; ///< 列数
huint32 Color; ///< 表格背景颜色
huint32 BestWidth; ///< 单元格宽度
huint32 CellBorderWidth; ///< 边框宽度
huint32 CellBorderColor; ///< 单元格边框颜色
huint32 CellPadding; ///< 单元格内边距
} HTableProperties;
typedef struct HTablePropOperate
{
HMenuItemKey key;
const void* value;
} HTablePropOperate;
HErrorCode LoadContextInBack(bool editType, const void *textStream, huint32 streamSize,
const HGenImageParam *param, HEditVAlignment vAlignment,
bool backgroundTrans, huint32 backgroundColor,
huint32 *pages);
HErrorCode InitEdit(const void(*callback)(HTextKey key, const void *value));
HErrorCode DestroyEdit();
HErrorCode GetPageImageInBack(huint32 pageNo, HImageInfo *image);
HErrorCode FreeImageInBack(HImageInfo *image);
}
如何根据这个头文件编写方便快捷的ava调用方法呢?
向楼主学习
页:
[1]