简介

Plugin-x是cocos2d-x最近版本中引入的特性,旨在解决第三方SDK接入的问题,最大程度的简化接入工作,增加可重用性。第一部分主要介绍PluginX如何使用,不涉及设计原理相关内容。

${cocos2d-x root}\plugin目录下是PluginX所在位置,从设计和相关文档看感觉这东西相当复杂,但实际上使用起来非常简便。(复杂的设计是为了使用上简单方便)

前提

必要条件是配置好Android开发环境,需要NDK。Win下需要安装Cygwin,Cygwin需要gcc、make包,因为这个模块里的自动化脚本是Unix Shell。

使用现有Plugin步骤

publish.sh 编译输出

  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中的文件主要有:

    • 头文件 .h
    • C++静态库 .a
    • java库文件 .lib
    • Android makefile文件 .mk
    • 其它plugin用到的资源

一些问题

  1. 由于project.properties中的target版本找不到(默认level = 7),编译失败。我都修改到了8。
  2. copy的资源目录为只读目录并且权限不对,不能访问,对后续的文件操作有影响。发现是Cygwin的问题,Google处理一下即可。

修改目标工程

把plugin应用到具体的Android工程中,这一步需要进行修改、增加内容,让目标工程正常使用需要的plugin。

gameDevGuide.sh 自动化修改部分

这是一个做关键修改的自动化脚本,它会自动把资源添加、修改到目标工程,非常简单、好用。

  1. 执行plugin/tools/gameDevGuide.sh,根据UI提示输入Android目录,然后Next。
  2. 接下来弹出一个带复选框的界面,选择需要使用的plugin,Finish即可。

大致会做如下修改:

  • Android.mk —– 加入plugin模块C++ 静态库的依赖
  • Application.mk —– 增加ndk编译选项
  • .project —– 链接publish目录下的相关资源
  • .classpath —– 加入相关的java 库文件依赖
  • AndroidManifest.xml —– 加入plugin需要的Activity声明或权限声明

手动修改部分

还有一些需要手动修改的部分。

  1. 修改ndk-build参数,加入publish目录到NDK_MODULE_PATH,修改build_native.sh文件(需要在shell中定义PLUGIN_ROOT值),例如:

     NDK_MODULE_PATH=${PLUGIN_ROOT}/publish:(冒号后面是原有值)
  2. 修改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;
    }
  3. 在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());
    }
    ...
    }
  4. 一些SDK的特殊修改

    例如nd91,需要依赖一个Lib工程。

C++代码里使用PluginX

JNI调用和相关的虚接口都已经在Protocol工程里处理好了,所以使用时都不用关心,可直接使用。下面是一些示例代码:

  1. 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;
  2. 使用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", &paramMap);
  3. 还可以调用自定义的方法,不详细介绍。

一些问题

  1. 导入工程到Eclipse后,Lib库没有找到。发现这里是通过修改.project加入LinkedResources标记,把Plugin/publish目录引入的。使劲刷新下工程就好了。。。

  2. C++代码ndk编译不过,后来发现是Plugin有个独立的命名空间,需要引入。。。

  3. 找不到org/cocos2dx/plugin/AnalyticsUmeng,仔细一看,发现这个类是定义在plugin/plugins/umeng/proj.android/src下的。又一检查,发现这个工程根本没有编译通过,没有生成.jar文件。很奇怪,所有jar文件在publish脚本跑过后都没有生成,手动ant操作一次才出来。

    查了半天,原来是ANT路径输入不全,没写bin目录。无奈啊。。。

经过艰苦的调试与修改,终于可以正常跑通了。估计能遇到的问题我遇过了,总之都是小问题。

总结

使用上,两个自动化脚本跑一下,手动修改几个点,就可以了,可以说非常简单。简化了很多繁杂的工作,但是实际上整个模块的设计比较复杂,如果对JNI、Ant打包、Shell脚本等等没个详细了解的话,出现问题很难搞定。

Cocos2d-x PluginX (一)使用手册的更多相关文章

  1. Cocos2D中使用CCDrawNode绘制几何图形崩溃的解决

    在cocos2D v3.x中已经不能像在v2.x中那样直接调用ccDrawXXX函数来绘制几何图形了. 我们可以使用CCDrawNode或者CCRenderer来绘制图形. 但是官方的Api手册中说的 ...

  2. Touch Handling in Cocos2D 3.x(一)

    原帖地址 Cocos2d 3.0 带来经过完全修正后的触摸处理系统.本篇博文将提供所有触摸相关的信息: 接收触摸 取得触摸位置 处理不同个触摸生命周期中的事件 实现一个拖放机制 让我们开始吧 ;) 通 ...

  3. Cocos2D v2.0至v3.x简洁转换指南(三)

    Cocos2D 3.3中的注意事项 如果你在使用Cocos2D 3.3+(是SpriteBuilder 1.3+的一部分)你将不得不替分别的换所有存在的UITouch和UITouchEvent为CCT ...

  4. cocos2d接安卓facebook插件(已测cocos-x 3.7 3.8版本)

    1  控制台创建新工程: a 控制台 进入cocos2d文件夹下面,如cocos2d-x-3.7.1,执行setup.py,未设置NDK SDK ANT 路径的设置路径,需要改路径的 explore ...

  5. FREERTOS 手册阅读笔记

    郑重声明,版权所有! 转载需说明. FREERTOS堆栈大小的单位是word,不是byte. 根据处理器架构优化系统的任务优先级不能超过32,If the architecture optimized ...

  6. JS魔法堂:不完全国际化&本地化手册 之 理論篇

    前言  最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求--国际化&本地化.熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"的阶段而已. ...

  7. 转职成为TypeScript程序员的参考手册

    写在前面 作者并没有任何可以作为背书的履历来证明自己写作这份手册的分量. 其内容大都来自于TypeScript官方资料或者搜索引擎获得,期间掺杂少量作者的私见,并会标明. 大部分内容来自于http:/ ...

  8. Redis学习手册(目录)

    为什么自己当初要选择Redis作为数据存储解决方案中的一员呢?现在能想到的原因主要有三.其一,Redis不仅性能高效,而且完全免费.其二,是基于C/C++开发的服务器,这里应该有一定的感情因素吧.最后 ...

  9. JS魔法堂:不完全国际化&本地化手册 之 实战篇

    前言  最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求--国际化&本地化.熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"的阶段而已. ...

随机推荐

  1. 51nod算法马拉松13

    A 取余最长路 不难发现路径可以拆成三条线段,只要知道两个转折点的位置就能计算出答案. 设sum(i,l,r)表示第i行从l到r元素的和,则答案可以表示为sum(1,1,x)+sum(2,x,y)+s ...

  2. db2icrt创建实例,提示主机名无效

    有这样一个现象,在DB2安装后,使用db2icrt 来创建实例时,提示主机名无效,提示如下:   [root@centos-0 instance]# ./db2icrt -u db2inst1 db2 ...

  3. 伪类link,hover,active,visited,focus的区别

    例一: /*css*/a:link{  color: blue;}a:visited{  color: green;}a:hover{  color: red;}a:focus{ color:blac ...

  4. jquery_插件

    编写插件的目的:给已有的一些列方法或函数做一个封装 jquery插件推荐命名方式 :jquery.[插件名].js  防止与插件库混淆 所有对象方法都应当附加到jquery.fn 对象上,所有的全局函 ...

  5. Android课程---布局管理器之相对布局(一)

    下面示例的是在父容器里如何设置按钮的位置,难度:***,重点是找到一个主按钮,设置它的id,然后根据它来设置其他按钮在父容器的位置. 代码示例: <?xml version="1.0& ...

  6. Codeforces Round #376 (Div. 2) C D F

    在十五楼做的cf..一会一断...比赛的时候做出了ABCF 就没有时间了 之后没看题解写出了D..E是个神奇的博弈(递推或者dp?)看了题解也没有理解..先写了CDF.. C 有n个袜子 每个袜子都有 ...

  7. loadrunner11.0 安装破解详解使用教程

    loadrunner11.0 安装破解详解使用教程 来源:互联网 作者:佚名 时间:01-21 10:25:34 [大 中 小] 很多朋友下载了loadrunner11但不是很会使用,这里简单介绍下安 ...

  8. Thinking in Java——笔记(7)

    Reusing Classes The first is composition,You're simply reusing the functionality of the code, not it ...

  9. Thinking in Java——笔记(6)

    Access Control A piece of work isn't good until it's been rewritten, often many times. Thus a primar ...

  10. nodejs 80端口监听失败及NODE_PATH不起作用的问题

    nodejs做web服务器,打开80时报错:Error: listen EACCES 0.0.0.0:80 80端口监听失败,是因为1024以下的端口需要root权限,需要sudo或su之后执行.但这 ...