空无清 发表于 2019-11-30 00:18

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调用方法呢?

冰雪冬樱250 发表于 2019-11-30 00:57

向楼主学习
页: [1]
查看完整版本: c++源码的数据结构复杂的情况下,java如何调用dll?