本文共 3341 字,大约阅读时间需要 11 分钟。
简介
Plugin-x是cocos2d-x最近版本中引入的特性,旨在解决第三方SDK接入的问题,最大程度的简化接入工作,增加可重用性。第一部分主要介绍PluginX如何使用,不涉及设计原理相关内容。
${cocos2d-x root}\plugin 目录下是PluginX所在位置,从设计和相关文档看感觉这东西相当复杂,但实际上使用起来非常简便。(复杂的设计是为了使用上简单方便)
前提
必要条件是配置好Android开发环境,需要NDK。Win下需要安装Cygwin,Cygwin需要gcc、make包,因为这个模块里的自动化脚本是Unix Shell。
1. 执行plugin/tools/publish.sh
脚本,根据提示输入Android SDK、NDK、Ant/bin的路径。
Ant是Android的打包工具,配置好的Eclipse Android开发环境,那这个工具不需要单独安装,可以搜索下。我这里的路径是: 开发环境目录/adt-bundle-windows-x86/eclipse/plugins/org.apache.ant_1.8.3.v201301120609/bin
。
2. 执行完毕后,会生成plugin/publish
目录,结果看起来大致如下:
这一步实际上,是把Protocol工程、和各个Plugins工程,编译打包输出jar包和其它关键资源到publish目录,以供后面目标工程中引用。
3. publish中的文件主要有:
把plugin应用到具体的Android工程中,这一步需要进行修改、增加内容,让目标工程正常使用需要的plugin。
这是一个做关键修改的自动化脚本,它会自动把资源添加、修改到目标工程,非常简单、好用。
plugin/tools/gameDevGuide.sh
,根据UI提示输入Android目录,然后Next。 大致会做如下修改:
还有一些需要手动修改的部分。
1. 修改ndk-build参数,加入publish目录到 NDK_MODULE_PATH
,修改 build_native.sh
文件(需要在shell中定义PLUGIN_ROOT
值),例如:
2. NDK_MODULE_PATH=${PLUGIN_ROOT}/publish:(冒号后面是原有值)
3. 修改main.cpp中的JNI_Onload方法
4. #include "PluginJniHelper.h"
5.
6. jint JNI_OnLoad(JavaVM *vm, void *reserved)
7. {
8. JniHelper::setJavaVM(vm);
9. PluginJniHelper::setJavaVM(vm); // for plugins
10.
11. return JNI_VERSION_1_4;
12.}
13.在Android主Activity中加入
14.import org.cocos2dx.plugin.PluginWrapper;
15.import org.cocos2dx.lib.Cocos2dxGLSurfaceView;
16.public class HelloIAP extends Cocos2dxActivity{
17.
18. protected void onCreate(Bundle savedState){
19. super.onCreate(savedState);
20. PluginWrapper.init(this); // for plugins
21.
22. // If you want your callback function can be invoked in GL thread, add this line:
23. PluginWrapper.setGLSurfaceView(Cocos2dxGLSurfaceView.getInstance());
24. }
25....
26.}
27.一些SDK的特殊修改
例如nd91,需要依赖一个Lib工程。
JNI调用和相关的虚接口都已经在Protocol工程里处理好了,所以使用时都不用关心,可直接使用。下面是一些示例代码:
1. load/unload plugin,直接通过java类名操作
2. // load plugin AnalyticsFlurry
3. s_pFlurry = dynamic_cast
4. (PluginManager::getInstance()->loadPlugin("AnalyticsFlurry"));
5.
6. // unload plugin AnalyticsFlurry
7. PluginManager::getInstance()->unloadPlugin("AnalyticsFlurry");
8. s_pFlurry = NULL;
9. 使用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);
10.还可以调用自定义的方法,不详细介绍。
使用上,两个自动化脚本跑一下,手动修改几个点,就可以了,可以说非常简单。简化了很多繁杂的工作,但是实际上整个模块的设计比较复杂,如果对JNI、Ant打包、Shell脚本等等没个详细了解的话,出现问题很难搞定
当从一台机器拷贝到另外一台机器的时候
发布时修改local.properties
sdk.dir=e:/tools/android_sdk_64
plugin.dir=e:/svn/client/sanguo_card_client/Dependencies/cocos2dx/cocos2d-x-2.2/plugin
modifyProject.py,修改12行将
nameEle.text ='plugin-x'
修改为 nameEle.text = 'plugin’
modifyClassPath.py
pathAttr ='plugin-x/' + pluginName + '/android/' + filename
改为
pathAttr ='plugin/publish/' +pluginName + '/android/' + filename
28.#include "PluginJniHelper.h"
转载地址:http://lttgi.baihongyu.com/