Plugin-x是cocos2d-x最近版本中引入的特性,旨在解决第三方SDK接入的问题,最大程度的简化接入工做,增长可重用性。第一部分主要介绍PluginX如何使用,不涉及设计原理相关内容。java
${cocos2d-x root}\plugin
目录下是PluginX所在位置,从设计和相关文档看感受这东西至关复杂,但实际上使用起来很是简便。(复杂的设计是为了使用上简单方便)android
必要条件是配置好Android开发环境,须要NDK。Win下须要安装Cygwin,Cygwin须要gcc、make包,由于这个模块里的自动化脚本是Unix Shell。web
执行plugin/tools/publish.sh
脚本,根据提示输入Android SDK、NDK、Ant/bin的路径。shell
Ant是Android的打包工具,配置好的Eclipse Android开发环境,那这个工具不须要单独安装,能够搜索下。我这里的路径是:
开发环境目录/adt-bundle-windows-x86/eclipse/plugins/org.apache.ant_1.8.3.v201301120609/bin
。apache
执行完毕后,会生成plugin/publish
目录,结果看起来大体以下:windows
这一步实际上,是把Protocol工程、和各个Plugins工程,编译打包输出jar包和其它关键资源到publish目录,以供后面目标工程中引用。app
publish中的文件主要有:eclipse
把plugin应用到具体的Android工程中,这一步须要进行修改、增长内容,让目标工程正常使用须要的plugin。ide
这是一个作关键修改的自动化脚本,它会自动把资源添加、修改到目标工程,很是简单、好用。工具
plugin/tools/gameDevGuide.sh
,根据UI提示输入Android目录,而后Next。大体会作以下修改:
还有一些须要手动修改的部分。
修改ndk-build参数,加入publish目录到NDK_MODULE_PATH
,修改build_native.sh
文件(须要在shell中定义PLUGIN_ROOT值),例如:
NDK_MODULE_PATH=${PLUGIN_ROOT}/publish:(冒号后面是原有值)
修改main.cpp中的JNI_Onload方法
#include "PluginJniHelper.h" jint JNI_OnLoad(JavaVM *vm, void *reserved) { JniHelper::setJavaVM(vm); PluginJniHelper::setJavaVM(vm); // for plugins return JNI_VERSION_1_4; }
在Android主Activity中加入
import org.cocos2dx.plugin.PluginWrapper; import org.cocos2dx.lib.Cocos2dxGLSurfaceView; public class HelloIAP extends Cocos2dxActivity{ protected void onCreate(Bundle savedState){ super.onCreate(savedState); PluginWrapper.init(this); // for plugins // If you want your callback function can be invoked in GL thread, add this line: PluginWrapper.setGLSurfaceView(Cocos2dxGLSurfaceView.getInstance()); } ... }
一些SDK的特殊修改
例如nd91,须要依赖一个Lib工程。
JNI调用和相关的虚接口都已经在Protocol工程里处理好了,因此使用时都不用关心,可直接使用。下面是一些示例代码:
load/unload plugin,直接经过java类名操做
// load plugin AnalyticsFlurry s_pFlurry = dynamic_cast<ProtocolAnalytics*> (PluginManager::getInstance()->loadPlugin("AnalyticsFlurry")); // unload plugin AnalyticsFlurry PluginManager::getInstance()->unloadPlugin("AnalyticsFlurry"); s_pFlurry = NULL;
使用plugin
直接使用protocol中定义的接口基本能够知足所有需求了,以下:
// enable the debug mode s_pFlurry->setDebugMode(true); // log an event s_pFlurry->logEvent("music"); // log an event with params LogEventParamMap paramMap; paramMap.insert(LogEventParamPair("type", "popular")); s_pFlurry->logEvent("music", ¶mMap);
还能够调用自定义的方法,不详细介绍。
导入工程到Eclipse后,Lib库没有找到。发现这里是经过修改.project加入LinkedResources标记,把Plugin/publish目录引入的。使劲刷新下工程就行了。。。
C++代码ndk编译不过,后来发现是Plugin有个独立的命名空间,须要引入。。。
找不到org/cocos2dx/plugin/AnalyticsUmeng,仔细一看,发现这个类是定义在plugin/plugins/umeng/proj.android/src下的。又一检查,发现这个工程根本没有编译经过,没有生成.jar文件。很奇怪,全部jar文件在publish脚本跑事后都没有生成,手动ant操做一次才出来。
查了半天,原来是ANT路径输入不全,没写bin目录。无奈啊。。。
通过艰苦的调试与修改,终于能够正常跑通了。估计能遇到的问题我遇过了,总之都是小问题。
使用上,两个自动化脚本跑一下,手动修改几个点,就能够了,能够说很是简单。简化了不少繁杂的工做,可是实际上整个模块的设计比较复杂,若是对JNI、Ant打包、Shell脚本等等没个详细了解的话,出现问题很难搞定。