增加新接口指导(可选)
如果第三方应用需要使用的接口,或者接口中的参数在Windows SDK中有,但是在AppService的JavaScript接口中没有,则需要开发者自己新增接口,或者修改已有的接口,并重新编译UISDKJSAdapter。
下文中的示例代码以加入会议为例(joinConfByID),说明如何新增一个接口。

在UISDKJsAdapter中增加接口转换的代码以及编译UISDKAdapter需要开发者具备基本的C/C++能力。
AppService中增加JavaScript接口
- 找到Windows SDK中的接口定义
在Windows SDK的“接口参考”中找到相应的接口定义,了解每个参数的含义。
以“加入会议”为例,包含三个参数,分别为“confId”、“password”和“name”。
- 在hwSDKService.js的HWSDKService类中增加新的方法定义
- 在cmd中增加该接口的CMD编号,需要确保与HWSDKService中的其他cmd不重复。
- 在description中增加对该接口的描述。
- 在param中增加json格式的接口参数,参数名称与Windows SDK中的参数名称保持一致。
- 调用sendMessage接口将命令发送给UISDKJSAdapter。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/** * @api * @description 通过会议ID和密码加入已经存在的会议 * @param confId string 会议ID * @param password string 会议密码 * @param name string 会议昵称 */ joinConfByID(param) { const data = { cmd: 5, description: "hwmService_joinConfByID", param: { confId: param.confId, password: param.password, name: param.name ? param.name : "" } }; return this.sendMessage({ data }); }
UISDKJSAdapter中增加C++接口
- 在JSADAPTERWND_SERVICE_CMD枚举中增加新接口的CMD编号
在UISDKJSAdapter/JSAdapterService.h的JSADAPTERWND_SERVICE_CMD枚举中增加CMD编号,该编号需要与HWSDKService中新加接口的cmd值保持一致。
以“加入会议”为例,就是增加“JSADAPTERWND_CMD_JOIN_CONF_BYID”。
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
typedef enum tagJSADAPTERWND_SERVICE_CMD { JSADAPTERWND_CMD_BEGIN = 0, JSADAPTERWND_CMD_INIT, // 初始化 JSADAPTERWND_CMD_SET_PROXY, // 设置代理 JSADAPTERWND_CMD_SET_SERVER, // 设置服务器地址 JSADAPTERWND_CMD_LOGIN, // 登录 JSADAPTERWND_CMD_JOIN_CONF_BYID, // id入会 JSADAPTERWND_CMD_EXIT_SDK, // 退出sdk JSADAPTERWND_CMD_CREATE_CONF, // 创建会议 JSADAPTERWND_CMD_ADD_ATTENDEE, // 会中邀人 JSADAPTERWND_CMD_LOGOUT, // 登出 JSADAPTERWND_CMD_CONFIG, // 配置 JSADAPTERWND_CMD_BOOK_CONF, //预约会议 JSADAPTERWND_CMD_GET_VMR_LIST, //获取VmrList JSADAPTERWND_CMD_GET_CONF_INFO, //获取会议信息 JSADAPTERWND_CMD_EDIT_CONF, //编辑会议 JSADAPTERWND_CMD_CANCEL_CONF, //取消会议 JSADAPTERWND_CMD_CLEAN_CONFIG, //清除配置 JSADAPTERWND_CMD_JOIN_CONF_BY_RANDOM, JSADAPTERWND_CND_RENAMESELF, JSADAPTERWND_CMD_CHANGE_VMRINFO, JSADAPTERWND_CMD_JOIN_CONF_BY_LINK, JSADAPTERWND_CMD_END } JSADAPTERWND_SERVICE_CMD;
- 在g_stJsAdapterWndCmdHandler函数指针数组中增加转换接口函数
在UISDKJSAdapter/JSAdapterService.cpp的g_stJsAdapterWndCmdHandler数组中增加对应CMD的接口转换函数。
以“加入会议”为例,就是增加“,{ JSADAPTERWND_CMD_JOIN_CONF_BYID, &JSAdapterService::JoinConfById }”。
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
static const JSADAPTERWND_CMD_HANDLER g_stJsAdapterWndCmdHandler[] = { { JSADAPTERWND_CMD_BEGIN, 0 } ,{ JSADAPTERWND_CMD_INIT, &JSAdapterService::Init } ,{ JSADAPTERWND_CMD_SET_PROXY, &JSAdapterService::SetProxy } ,{ JSADAPTERWND_CMD_SET_SERVER, &JSAdapterService::SetServer } ,{ JSADAPTERWND_CMD_LOGIN, &JSAdapterService::Login } ,{ JSADAPTERWND_CMD_JOIN_CONF_BYID, &JSAdapterService::JoinConfById } ,{ JSADAPTERWND_CMD_EXIT_SDK, &JSAdapterService::ExitSdk } ,{ JSADAPTERWND_CMD_CREATE_CONF, &JSAdapterService::CreateConf } ,{ JSADAPTERWND_CMD_ADD_ATTENDEE, &JSAdapterService::AddAttendee } ,{ JSADAPTERWND_CMD_LOGOUT, &JSAdapterService::Logout } ,{ JSADAPTERWND_CMD_CONFIG, &JSAdapterService::Config } ,{ JSADAPTERWND_CMD_BOOK_CONF, &JSAdapterService::BookConf } ,{ JSADAPTERWND_CMD_GET_VMR_LIST, &JSAdapterService::GetVmrList } ,{ JSADAPTERWND_CMD_GET_CONF_INFO, &JSAdapterService::GetConfInfo } ,{ JSADAPTERWND_CMD_EDIT_CONF, &JSAdapterService::EditConf} ,{ JSADAPTERWND_CMD_CANCEL_CONF, &JSAdapterService::CancelConf} ,{ JSADAPTERWND_CMD_CLEAN_CONFIG, &JSAdapterService::CleanConfig} ,{ JSADAPTERWND_CMD_JOIN_CONF_BY_RANDOM, &JSAdapterService::JoinConfByRandom} ,{ JSADAPTERWND_CND_RENAMESELF, &JSAdapterService::RenameSelf} ,{ JSADAPTERWND_CMD_CHANGE_VMRINFO, &JSAdapterService::ChangeVmrInfo} ,{ JSADAPTERWND_CMD_JOIN_CONF_BY_LINK ,&JSAdapterService::JoinConfByLink} ,{ JSADAPTERWND_CMD_END, 0 } };
- 实现新增的接口转换函数
在UISDKJSAdapter/JSAdapterService.cpp的JSAdapterService类中实现新增加的接口转换函数。该函数就是把HWSDKService传过来的命令中的json参数转换成Windows SDK的原生接口参数。
以“加入会议”为例。
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
int JSAdapterService::JoinConfById(const Json::Value& params) { HwmJoinConfByIdInfo joinConfByIdInfo = { 0 }; int ret = Util::CopyJsonStr(joinConfByIdInfo.confId, sizeof(joinConfByIdInfo.confId), params["confId"]); ret += Util::CopyJsonStr(joinConfByIdInfo.password, sizeof(joinConfByIdInfo.confId), params["password"]); ret += Util::CopyJsonStr(joinConfByIdInfo.name, sizeof(joinConfByIdInfo.name), params["name"]); if (ret != 0) { LOG_ERROR("string copy error %d.", ret); } ret = hwmsdkagent::JoinConfById(&joinConfByIdInfo); if (ret != 0) { LOG_ERROR("JoinConfById failed %d.", ret); } return ret; }
- 处理Windows SDK接口的回调函数
在Windows SDK接口对应的回调函数中,把结果发送给HWSDKService。
以“加入会议”为例,Windows SDK提供的回调入口是OnJoinConfByIdResult,在该函数中发送结果给HWSDKService。
- 在JSAdapterCallback.h的JSAdapterCallback类定义中,增加OnJoinConfByIdResult。
1 2 3 4 5 6 7 8 9 10 11 12
/** * @brief [en] Callback of JoinConfById interface. * [cn] 通过会议id入会回调 * * @param [in] hwmsdk::HwmErrCode ret [en] Return code * [cn] 返回值 * @param [in] const char* reason [en] Fail reason * [cn] 失败原因描述 * @attention [en] NA * [cn] NA **/ virtual void OnJoinConfByIdResult(hwmsdk::HwmErrCode ret, const char* reason);
- 在JSAdapterCallback.cpp中实现OnJoinConfByIdResult。
1 2 3 4
void JSAdapterCallback::OnJoinConfByIdResult(hwmsdk::HwmErrCode ret, const char* reason) { JSAdapterNotify::NotifyJoinConfByIdResult(ret, reason); }
1 2 3 4 5
void JSAdapterNotify::NotifyJoinConfByIdResult(int reasonCode, const std::string& description) { LOG_INFO("Start"); SendCallback(JSADAPTERWND_CMD_JOIN_CONF_BYID, reasonCode); }
这里调用SendCallback中的cmd就是步骤1中新增加的值。
- 在JSAdapterCallback.h的JSAdapterCallback类定义中,增加OnJoinConfByIdResult。
重新编译UISDKAdapter
- 复制华为云会议Windows SDK的lib库和头文件
将 1下载的Windows SDK的“\SDK\include\”的头文件复制到Demo的“\JsAdapter\HwmSdkLibs\”目录下。
将1下载的Windows SDK的“\SDK\lib\win32\”的“hwm_sdk_agent.lib”文件复制到Demo的“\JsAdapter\HwmSdkLibs\”目录下。
图1 复制Windows SDK的头文件和lib库 - 在Visual Studio 2017中打开工程,并配置工程属性
- 双击Demo的“\JsAdapter\JsApdpter\JsApdpter.sln”,打开工程。
- 选择编译版本。
图2 选择编译版本
这里选择x86还是x64版本,取决于步骤1中的hwm_sdk_agent.lib复制的是win32版本还是x64版本。通常使用x86即可。
- 配置工程属性
图3 右键打开属性配置图4 选择“配置属性>>常规>>Windows SDK版本”UISDKJSAdapter对windows SDK版本没用强依赖,任意选择一个版本即可。
- 编译
编译整改工程。
图5 “生成>>重新生成解决方案”编译完成后在 Demo的“\JsAdapter\JsApdpter\”下生成“JsApdpter.dll”。将该dll复制到第三方项目的根目录下即可使用。
