cocos2dx 3.3 pluginx protocols文件夹分析

cocos2dx 3.3 pluginx protocols文件夹分析,第1张

概述include--所有需要包含的头文件,android和ios共用 platform--平台层代码,分android和ios2个文件夹,各自对应各平台代码 proj.android--android平台的protocols工程 proj.ios--ios平台的protocols工程 代码分析 这里主要分析android平台相关的代码 以支付相关的为主 有趣的点 load和unload只做delet include--所有需要包含的头文件,androID和ios共用
platform--平台层代码,分androID和ios2个文件夹,各自对应各平台代码
proj.androID--androID平台的protocols工程
proj.ios--ios平台的protocols工程


代码分析 这里主要分析androID平台相关的代码
以支付相关的为主


有趣的点 load和unload只做delete指针 *** 作,不对map做删除


总体思想 各种类型plugin分类处理--这可能导致同一个SDK要接多个plugin
c++部分代码需要把所有的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和unloadclass 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--工厂类,用于创建和清理pluginclass 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层(可选) 总结

以上是内存溢出为你收集整理的cocos2dx 3.3 pluginx protocols文件夹分析全部内容,希望文章能够帮你解决cocos2dx 3.3 pluginx protocols文件夹分析所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1077447.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存