Windows/macOS

升级指引

更新时间: 2021/07/22 12:18:41

sdk升级6.6.6及以上版本引导

当前使用SDK的痛点

1.SDK引入包含目录比较多,项目配置起来不方便

2.SDK C++封装层 nim与nim_chatroom中包含了许多重复代码

3.C++封装层静态库只提供了运行时库为md的项目

4.nim_demo引入的SDK与从官网上下载的SDK在代码层面上略有出入,升级SDK时需要进行代码对比

出于解决以上几个痛点的目的我们对6.6.6的SDK进行了目录调整,以使用户接入SDK更加快捷方便, 保持SDK与nim demo引入SDK的一致性, 满足不同用户对C++封装层的不同要求,例如以静态库(mt/md)或者动态库的方式引入,并对三方库的引入做了一些改变

SDK 目录结构变化

SDK 目录结构及主要文件介绍

nim_sdk ..................................................... SDK目录
    include ................................................. SDK 引入包含目录
        depend_lib .......................................... SDK C++封装层依赖库目录
            include ......................................... SDK C++封装层依赖库包含目录
                json ........................................ Json工具包含目录
                nim_json_util.h ............................. JSON工具辅助方法
                nim_sdk_util.h .............................. 提供加载/卸载SDK以及获取接口的方法
        nim_c_api.h ......................................... c im api引入文件
        nim_chatroom_c_api.h ................................ c chatroom api引入文件
        nim_cpp_api.h ....................................... c++ im api 引入文件
        nim_chatroom_cpp_api.h .............................. c++ chatroom api 引入文件
        nim_cpp_tools_api.h ................................. nim 工具类api 引入文件
    public_define ........................................... SDK 共公类型定义目录 c/c++都会引用到数据结构定义
        defines ............................................. im/chatroom/nim_tools数据类型定义目录
        util ................................................ 编译开关及基础类型定义目录
        nim_sdk_define_include.h ............................ im 公共数据类型定义引入文件
        nim_chatroom_define_include.h ....................... chatroom 公共数据类型定义引入文件
        nim_tool_define_include.h ........................... nim_tools 公共数据类型定义引入文件
        nim_util_include.h .................................. 基础类型定义引入文件
    src ..................................................... c api/c++封装层实现代码目录
        c_sdk ............................................... c api 定义代码目录                
        cpp_sdk ............................................. c++封装层代码目录
            depend_lib ...................................... c++封装层依赖库的实现代码目录
                cpp_wrapper_util_md.sln ..................... c++封装层依赖库 md/mdd 运行时库工程的解决方案文件
                cpp_wrapper_util_mt.sln ..................... c++封装层依赖库 mt/mtd 运行时库工程的解决方案文件
            nim ............................................. im c++封装层实现代码目录
                nim_sdk_cpp_wrapper_dll.vcxproj ............. im c++封装层动态库工程文件 
                nim_sdk_cpp_wrapper_lib_md.vcxproj .......... im c++封装层静态库 md/mdd 运行时库工程文件
                nim_sdk_cpp_wrapper_lib_mt.vcxproj .......... im c++封装层静态库 mt/mtd 运行时库工程文件
            nim_chatroom .................................... chatrooom c++封装层实现代码目录
                nim_chatroom_sdk_cpp_wrapper_dll.vcxproj .... chatrooom c++封装层动态库工程文件
                nim_chatroom_sdk_cpp_wrapper_lib_md.vcxproj . chatrooom c++封装层静态库 md/mdd 运行时库工程文件
                nim_chatroom_sdk_cpp_wrapper_lib_mt.vcxproj . chatrooom c++封装层静态库 mt/mtd 运行时库工程文件
            nim_tools ....................................... nim tools c++封装层实现代码目录
                audio ....................................... audio模块 c++封装层实现代码目录
                http ........................................ http模块 c++封装层实现代码目录
    libs .................................................... c++封装层(静态库)、依赖库输出目录
        win ................................................. windows平台库目录
            x86 ............................................. x86平台输出目录
            x64 ............................................. x64平台输出目录
        iOS ................................................. iOS平台库目录
        Mac ................................................. Mac平台库目录

升级注意事项

SDK 引入

文件包含目录

引入SDK时包含目录包含到nim_sdk目录即可,以im demo 的custom_app_sdk工程为例,如下图

c++封装层引入解决方案

C++封装层的工程文件在nim_sdk/src/nim/、nim_sdk/src/nim_chatroom/目录下,可以直接添加到解决方案中,以im demo为例如下图

静态库引入

C++封装层(静态库方式)缺省的输出目录为nim_sdk/libs/x86/md(mt)/、nim_sdk/libs/x64/md(mt)/,在库管理器中可以根据选择的运行时库指定附加依库目录到libs相应的目录并指定相应的静态库到附加依赖项中,以im demo 的custom_app_sdk工程为例,如下图

C++动态库的使用方式

C++封装层(静态库方式)缺省的输出目录为nim_sdk/bin/x86_dlls/、nim_sdk/bin/x64_dlls/,当以动态库的方式使用c++封装层时,可以将生成后的nim_sdk_cpp_wrapper_dll.dll/nim_sdk_cpp_wrapper_dll_d.dll、nim_chatroom_sdk_cpp_wrapper_dll.dll/nim_chatroom_sdk_cpp_wrapper_dll_d.dll拷贝到指定目录(例如exe的输出目录),以im demo的custom_app_sdk工程为例,如下图

C++封装层依赖库编译

C++封装层依赖库(depend_lib)预先生成了vs2013运行时库为md(mdd)/mt(mtd),debug/release版本的静态库,如果开发者需要不同vs版本(不同的平台工具集)的可静态库,以打开nim_sdk/src/cpp_sdk/depend_lib/cpp_wrapper_util_md.sln(cpp_wrapper_util_mt.sln),修改cpp_wrapper工程的平台工具集来生成相应的版本.

SDK回调应用层的异步实现

SDK在回调应用层时,如果应用层没有进行异步处理,可能会阻塞SDK内部线程,发生SDK没有响应、断线等问题,为了避免这种情况的发生,应用层在接收到SDK的回调时最好转为异步。SDK实现了指定异步回调的接口

/** @fn void SetCallbackFunction(const ChatRoom::SDKClosure& callback)
* 当以动态库使用SDK时 设置SDK回调方法,为了不阻塞SDK线程,在回调中应该把任务抛到应用层的线程中
* @param[in] callback	  回调方法
* @return void 无返回值
*/
static void SetCallbackFunction(const SDKClosure& callback);

以 im demo为例,其使用方法如下

nim::Client::SetCallbackFunction([](const StdClosure & task) {
	nbase::ThreadManager::PostTask(ThreadId::kThreadUI, task);
});

关于 nim_cpp_wrapper_util::Json

nim_cpp_wrapper_util::Json是把jsoncpp封装到了cpp_wrapper_util中,nim_cpp_wrapper_util::Json与json(jsoncpp)的转换可以参考以下代码(im demo中 nim_demo\tool_kits\shared\cpp_wrapper_util.h)

Json::Value NimCppWrapperJsonValueToJsonValue(const nim_cpp_wrapper_util::Json::Value& param)
{
    Json::Value ret;
    Json::Reader().parse(nim_cpp_wrapper_util::Json::FastWriter().write(param), ret);
    return ret;
}
nim_cpp_wrapper_util::Json::Value JsonValueToNimCppWrapperJsonValue(const Json::Value& param)
{
    nim_cpp_wrapper_util::Json::Value ret;
    nim_cpp_wrapper_util::Json::Reader().parse(Json::FastWriter().write(param), ret);
    return ret;
}
此文档是否对你有帮助?
有帮助
去反馈
  • sdk升级6.6.6及以上版本引导
  • 当前使用SDK的痛点
  • SDK 目录结构变化
  • SDK 目录结构及主要文件介绍
  • 升级注意事项
  • SDK 引入
  • 文件包含目录
  • c++封装层引入解决方案
  • 静态库引入
  • C++动态库的使用方式
  • C++封装层依赖库编译
  • SDK回调应用层的异步实现
  • 关于 nim_cpp_wrapper_util::Json