cocos2dx 3.3 pluginx protocols文件夹分析
发布时间:2020-12-14 16:53:50 所属栏目:百科 来源:网络整理
导读:include--所有需要包含的头文件,android和ios共用 platform--平台层代码,分android和ios2个文件夹,各自对应各平台代码 proj.android--android平台的protocols工程 proj.ios--ios平台的protocols工程 代码分析 这里主要分析android平台相关的代码 以支付相
include--所有需要包含的头文件,android和ios共用
platform--平台层代码,分android和ios2个文件夹,各自对应各平台代码 proj.android--android平台的protocols工程 proj.ios--ios平台的protocols工程 代码分析这里主要分析android平台相关的代码以支付相关的为主 有趣的点load和unload只做delete指针操作,不对map做删除总体思想各种类型plugin分类处理--这可能导致同一个SDK要接多个pluginc++部分代码需要把所有的plugin都带上,java层可以选择带上指定的plugin 所有请求都由c++层发起,包括加载、卸载、登陆、支付、传递信息等,这就意味着,几乎所有和服务端的交互,都放在c++层做了,java层只负责和第三方做交互,以及下发支付结果 获取道具列表、创建订单全部在c++层,最后的处理结果展示,也在c++层 流程分析load流程:调用加载loadPlugins---进入plugin系统内{{ PluginManager::getInstance()->loadPlugin(name)--PluginFactory::getInstance()->createPlugin(name)--java:PluginWrapper.initPlugin(创建java实例)--new ProtocolXXX }}离开plugin系统 unload流程: 调用加载unloadPlugins---进入plugin系统内{{ PluginManager::getInstance()->unloadPlugin(name)--从map里删除对应的指针 }}离开plugin系统 业务流程,这里用pay为例: 调用加载pay---进入plugin系统内{{ ProtocolIAP->payForProduct--java:InterfaceIAP_ClassName.payForProduct--java:SDK->PAY--第三方支付结果返回--java:IAPWrapper.onPayResult--Java_org_cocos2dx_plugin_IAPWrapper_nativeOnPayResult--ProtocolIAP->onPayResult--PayResultListener->onPayResult }}离开plugin系统 //PluginManager--manager,用于管理,主要是load和unload class PluginManager { public: // 清理_pluginsMap virtual ~PluginManager(); // 单例,new一个 static PluginManager* getInstance(); // 结束时,释放单例指针,同时清理PluginFactory static void end(); // 以下只对map里的plugin指针做delete,不删除name,new操作用PluginFactory实现 // 根据name加载对应的plugin PluginProtocol* loadPlugin(const char* name); // 根据name卸载对应的plugin void unloadPlugin(const char* name); private: PluginManager(void); std::map<std::string,PluginProtocol*> _pluginsMap; // 用于保存所有的plugin } //PluginParam--plugin调用java的所有需要param的地方,都直接用这个param做调用,方便管理 各种类型的param类,方便在plugin中使用与传递 除了各种基础类型以外,还有一个std::map<std::string,PluginParam*>和std::map<std::string,std::string> std::map<std::string,PluginParam*>,超过1个参数时,会把多个参数直接做成一个map参数,然后再传入 2个map类型参数,传给java层,其实是以JSONObject的形式传过去的 //PluginFactory--工厂类,用于创建和清理plugin class PluginProtocol; class PluginManager; class PluginFactory { public: virtual ~PluginFactory(); // 单例,new一个 static PluginFactory* getInstance(); // 结束时,释放单例指针 static void purgeFactory(); private: friend class PluginManager; PluginFactory(void); // 根据name创建对应的plugin,name为对应的plugin的类名,调用java层的初始化PluginWrapper.initPlugin,然后PluginWrapper.getPluginType获取type,然后在c++层根据type来new一个plugin,然后调用PluginUtils::initJavaPlugin PluginProtocol* createPlugin(const char* name); } //PluginProtocol--各种plugin的基类,抽象了各种plugin可能用到的方法,里面大部分方法都是直接调用了PluginUtils内的方法,主要都是通过jni调用java方法 class PluginFactory; class PluginProtocol { public: // 清理数据 virtual ~PluginProtocol(); // 获取plugin信息 名称,版本,SDK版本等 inline const char* getPluginName() { return _pluginName.c_str(); } std::string getPluginVersion(); std::string getSDKVersion(); // 调试开关 从c++层设置java部分的调试开关 void setDebugMode(bool bDebug); // 调用各种返回值类型的java方法 void callFuncWithParam(const char* funcName,PluginParam* param,...); void callFuncWithParam(const char* funcName,std::vector<PluginParam*> params); std::string callStringFuncWithParam(const char* funcName,...); std::string callStringFuncWithParam(const char* funcName,std::vector<PluginParam*> params); int callIntFuncWithParam(const char* funcName,...); int callIntFuncWithParam(const char* funcName,std::vector<PluginParam*> params); bool callBoolFuncWithParam(const char* funcName,...); bool callBoolFuncWithParam(const char* funcName,std::vector<PluginParam*> params); float callFloatFuncWithParam(const char* funcName,...); float callFloatFuncWithParam(const char* funcName,std::vector<PluginParam*> params); protected: PluginProtocol() {} private: friend class PluginFactory; inline void setPluginName(const char* name) { _pluginName = name; } std::string _pluginName; }; //ProtocolIAP--支付相关接口 class PayResultListener // 支付结果监听,需要自己实现 { public: virtual void onPayResult(PayResultCode ret,const char* msg,TProductInfo info) = 0; virtual void onRequestProductsResult(IAPProductRequest ret,TProductList info){} }; class ProtocolIAP : public PluginProtocol { public: ProtocolIAP(); virtual ~ProtocolIAP(); typedef std::function<void(int,std::string&)> ProtocolIAPCallback; // 将开发者定义的数据传给java层,以hashTable形式 void configDeveloperInfo(TIAPDeveloperInfo devInfo); // 调用支付,同时以hashTable形式将支付参数传给java层 void payForProduct(TProductInfo info); void payForProduct(TProductInfo info,ProtocolIAPCallback cb); // 设置监听 CC_DEPRECATED_ATTRIBUTE void setResultListener(PayResultListener* pListener); // 获取监听 CC_DEPRECATED_ATTRIBUTE inline PayResultListener* getResultListener() { return _listener; } // 支付结果处理 void onPayResult(PayResultCode ret,const char* msg); // 设置回调,在没有监听的时候,支付结果处理会使用回调 inline void setCallback(ProtocolIAPCallback &cb) { _callback = cb; } // 获取回调 inline ProtocolIAPCallback getCallback() { return _callback; } protected: static bool _paying; TProductInfo _curInfo; PayResultListener* _listener; ProtocolIAPCallback _callback; }; //jni相关的类 PluginJniHelper--jni最底层的封装,将c风格jni代码封装成类,方便调用,如果需要扩展jni接口,在这里加 PluginJavaData--用于保存调用java方法相关的一些数据的一个结构 PluginUtils--主要是对调用java方法的一些封装,方便调用,如果需要扩展调用java方法相关的接口,在这里加 PluginJniMacros--调用java方法相关的一些宏 //其他 剩下的agent之类的一堆,属于另外一个套系,后面用到再慢慢分析 java层代码// wrapper相关的主要是java层与c++层的连接,主要是java调c++的代码相关的部分AdsWrapper IAPWrapper ShareWrapper SocialWrapper UserWrapper // interface相关的主要是各种类型plugin需要实现的抽象接口,所有接口由c++层主动调用 InterfaceAds InterfaceAnalytics InterfaceIAP InterfaceShare InterfaceSocial InterfaceUser // activity各个生命周期(resume pause destory等)相关的listener,在java层操作 PluginListener // plugin供java和c++调用的初始化等相关各种接口,plguin对外开放的所有接口都在这里,主activity代码要使用plugin只需要调用这里的接口即可 PluginWrapper 使用例子使用时,主要要实现 PayResultListener用于处理支付结果(!!必选!!) load用于加载plugin(!!必选!!) unload用于卸载plugin(!!必选!!) payForProduct用于调起支付(!!必选!!) configDeveloperInfo用于传递信息给java层(可选)(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |