如何整合第三方SDK到Plugin-X
翻译自:http://www.cocos2d-x.org/projects/cocos2d-x/wiki/How_to_Integrate_a_3rd_party_SDK_into_Plugin-X
前言
本文将为您展示如何实现一个插件.首先你应该手动创建一个插件工程.
我们会开发工具来帮助你完成以下大部分工作.
插件目录介绍
请保持你的插件目录结构如下:
- include : 头文件目录.
- platform : 不同平台的插件实现的文件夹.
- proj.android : 插件的android项目文件夹.
- proj.ios : 插件的ios项目文件夹.
注意 : 发布的工具实现依赖与以上目录结构.
插件类的声明
- 插件类应该继承自一个正确的协议类. 我们已经实现的协议类有 : ProtocolAnalytics, ProtocolIAP.
- 你的插件类声明应该包括:
- PLUGIN_REGISTER_DECL(插件类名字).
- 继承自基类的虚方法.
- 插件类的自定义方法.
- 以flurry插件为例,代码如下:
1#include "ProtocolAnalytics.h" 2 3class AnalyticsFlurry : public ProtocolAnalytics 4{ 5 PLUGIN_REGISTER_DECL(AnalyticsFlurry) // used by plugin register 6public: 7 8 ... 9 10 /** 11 virtual methods inherit from ProtocolAnalytics 12 */ 13 virtual bool init(); 14 virtual void startSession(const char* appKey); 15 virtual void stopSession(); 16 17 ... 18 19 /** 20 custom methods of AnalyticsFlurry 21 */ 22 void setAge(int age); 23 void setUserId(const char* userId); 24};
注意 : 不要为插件类声明一个public类型的构造方法.
插件类的实例由PluginManager来管理.
插件类的实现
也许你的插件会支持多平台.那么你应该将各个平台分开做.
android平台
android平台的实现包括两部分 : C++ & Java.
- C++部分
- 在cpp文件里添加PLUGIN_REGISTER_IMPL(PluginClassName). 例如:
1// AnalyticsFlurry.cpp 2 3... 4 5PLUGIN_REGISTER_IMPL(AnalyticsFlurry) 6 7...
- 在插件类的init()方法里调用接口 PluginUtils::initJavaPlugin() .
第一个参数是 this.第二个参数是包名以及java类名.示例:
1 bool AnalyticsFlurry::init() 2 { 3 return PluginUtils::initJavaPlugin(this, "org.cocos2dx.plugin.AnalyticsFlurry"); 4 }
- 实现继承自基类的虚方法, 比如:
1 void AnalyticsFlurry::logTimedEventBegin(const char* eventId) 2 { 3 ProtocolAnalytics::logTimedEventBegin(eventId); 4 }
- 实现插件类的自定义方法.
- 在cpp文件里添加PLUGIN_REGISTER_IMPL(PluginClassName). 例如:
- Java部分
插件的java代码在 proj.android 文件夹下。 文件夹如下 :
- build.xml : 使用于公布的工具. 可以复制其他的插件, 也可以编辑项目名字. 比如:
1<?xml version="1.0" encoding="UTF-8"?> 2<project name="libPluginFlurry" default="plugin-publish"> 3 ... 4</project>
- build_native.sh : 工具调用,用于ndk build. 可以从别的插件复制.
- ForManifest.xml : 在 tools/gameDevGuide.sh 里调用. 如果你的插件里需要在AndroidManifest.xml里面声明 activity,或者设置用户权限 . 在这个文件里添加他们.
- jni/Android.mk : 用于ndk build.为插件 编辑模块名字, 添加静态库 PluginProtocolStatic . 例子如下 :
... LOCAL_MODULE := PluginFlurryStatic LOCAL_MODULE_FILENAME := libPluginFlurryStatic ... LOCAL_WHOLE_STATIC_LIBRARIES := PluginProtocolStatic LOCAL_LDLIBS := -landroid LOCAL_LDLIBS += -llog include $(BUILD_STATIC_LIBRARY) $(call import-module, protocols/proj.android/jni)
- sdk : 第三方SDK的.jar文件放到这里.
- src : java代码放到这里. 在Java代码里,你要实现相关接口. Java类也需要一个带Context 参数的构造函数. 例子:
1package org.cocos2dx.plugin; 2public class AnalyticsFlurry implements InterfaceAnalytics { 3 ... 4 public AnalyticsFlurry(Context context) { 5 mContext = context; 6 } 7}
- 插件项目需要依赖于 plugin-x/protocols/proj.android 项目. 配置如下:
iOS平台
即将到来,敬请期待...
插件编译
- 编辑文件tools/config.sh. 添加插件目录名到变量 $ALL_PLUGINS.
export ALL_PLUGINS=("protocols" \ "flurry" "umeng" \ "alipay" "nd91")
- 运行脚本tools/publish.sh . 插件即会被编译.