cocos2dx 3.3 pluginx protocols文件夹分析

前端之家收集整理的这篇文章主要介绍了cocos2dx 3.3 pluginx protocols文件夹分析前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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系统


  1. //PluginManager--manager,用于管理,主要是load和unload
  2. class PluginManager
  3. {
  4. public:
  5. // 清理_pluginsMap
  6. virtual ~PluginManager();
  7. // 单例,new一个
  8. static PluginManager* getInstance();
  9. // 结束时,释放单例指针,同时清理PluginFactory
  10. static void end();
  11.  
  12.  
  13. // 以下只对map里的plugin指针做delete,不删除name,new操作用PluginFactory实现
  14. // 根据name加载对应的plugin
  15. PluginProtocol* loadPlugin(const char* name);
  16. // 根据name卸载对应的plugin
  17. void unloadPlugin(const char* name);
  18.  
  19.  
  20. private:
  21. PluginManager(void);
  22. std::map<std::string,PluginProtocol*> _pluginsMap; // 用于保存所有的plugin
  23. }




//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的形式传过去的


  1. //PluginFactory--工厂类,用于创建和清理plugin
  2. class PluginProtocol;
  3. class PluginManager;
  4. class PluginFactory
  5. {
  6. public:
  7. virtual ~PluginFactory();
  8. // 单例,new一个
  9. static PluginFactory* getInstance();
  10. // 结束时,释放单例指针
  11. static void purgeFactory();
  12.  
  13.  
  14. private:
  15. friend class PluginManager;
  16. PluginFactory(void);
  17.  
  18.  
  19. // 根据name创建对应的plugin,name为对应的plugin的类名,调用java层的初始化PluginWrapper.initPlugin,然后PluginWrapper.getPluginType获取type,然后在c++层根据type来new一个plugin,然后调用PluginUtils::initJavaPlugin
  20. PluginProtocol* createPlugin(const char* name);
  21. }




  1. //PluginProtocol--各种plugin的基类,抽象了各种plugin可能用到的方法,里面大部分方法都是直接调用了PluginUtils内的方法,主要都是通过jni调用java方法
  2. class PluginFactory;
  3. class PluginProtocol
  4. {
  5. public:
  6. // 清理数据
  7. virtual ~PluginProtocol();
  8.  
  9.  
  10. // 获取plugin信息 名称,版本,SDK版本等
  11. inline const char* getPluginName() { return _pluginName.c_str(); }
  12. std::string getPluginVersion();
  13. std::string getSDKVersion();
  14.  
  15.  
  16. // 调试开关 从c++层设置java部分的调试开关
  17. void setDebugMode(bool bDebug);
  18.  
  19.  
  20. // 调用各种返回值类型的java方法
  21. void callFuncWithParam(const char* funcName,PluginParam* param,...);
  22. void callFuncWithParam(const char* funcName,std::vector<PluginParam*> params);
  23.  
  24.  
  25. std::string callStringFuncWithParam(const char* funcName,...);
  26. std::string callStringFuncWithParam(const char* funcName,std::vector<PluginParam*> params);
  27.  
  28.  
  29. int callIntFuncWithParam(const char* funcName,...);
  30. int callIntFuncWithParam(const char* funcName,std::vector<PluginParam*> params);
  31.  
  32.  
  33. bool callBoolFuncWithParam(const char* funcName,...);
  34. bool callBoolFuncWithParam(const char* funcName,std::vector<PluginParam*> params);
  35.  
  36.  
  37. float callFloatFuncWithParam(const char* funcName,...);
  38. float callFloatFuncWithParam(const char* funcName,std::vector<PluginParam*> params);
  39.  
  40.  
  41. protected:
  42. PluginProtocol() {}
  43.  
  44.  
  45. private:
  46. friend class PluginFactory;
  47. inline void setPluginName(const char* name) {
  48. _pluginName = name;
  49. }
  50. std::string _pluginName;
  51. };




  1. //ProtocolIAP--支付相关接口
  2. class PayResultListener // 支付结果监听,需要自己实现
  3. {
  4. public:
  5. virtual void onPayResult(PayResultCode ret,const char* msg,TProductInfo info) = 0;
  6. virtual void onRequestProductsResult(IAPProductRequest ret,TProductList info){}
  7. };
  8.  
  9.  
  10. class ProtocolIAP : public PluginProtocol
  11. {
  12. public:
  13. ProtocolIAP();
  14. virtual ~ProtocolIAP();
  15.  
  16.  
  17. typedef std::function<void(int,std::string&)> ProtocolIAPCallback;
  18.  
  19.  
  20. // 将开发者定义的数据传给java层,以hashTable形式
  21. void configDeveloperInfo(TIAPDeveloperInfo devInfo);
  22.  
  23.  
  24. // 调用支付,同时以hashTable形式将支付参数传给java层
  25. void payForProduct(TProductInfo info);
  26. void payForProduct(TProductInfo info,ProtocolIAPCallback cb);
  27.  
  28.  
  29. // 设置监听
  30. CC_DEPRECATED_ATTRIBUTE void setResultListener(PayResultListener* pListener);
  31. // 获取监听
  32. CC_DEPRECATED_ATTRIBUTE inline PayResultListener* getResultListener()
  33. {
  34. return _listener;
  35. }
  36. // 支付结果处理
  37. void onPayResult(PayResultCode ret,const char* msg);
  38.  
  39.  
  40. // 设置回调,在没有监听的时候,支付结果处理会使用回调
  41. inline void setCallback(ProtocolIAPCallback &cb)
  42. {
  43. _callback = cb;
  44. }
  45.  
  46.  
  47. // 获取回调
  48. inline ProtocolIAPCallback getCallback()
  49. {
  50. return _callback;
  51. }
  52. protected:
  53. static bool _paying;
  54.  
  55.  
  56. TProductInfo _curInfo;
  57. PayResultListener* _listener;
  58. ProtocolIAPCallback _callback;
  59. };




//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层(可选)

猜你在找的Cocos2d-x相关文章