Cocos2d-x PluginX的使用(图文教程)

PluginX是为了配置安卓的 sdk 而开发使用的。但是没有见几个完整的,所以这些参考了好多文章,终于成功搞定,现在就详细的总结一下。

以 cocos2d-x 2.2.6为例,mac 系统,因为我的是 mac 系统,所以只写 mac 系统的,windows 系统的没有搞过,有需要的可以百度。

使用上面首先先说下默认的内置的那几个 sdk使用方法,然后后面再说怎么添加自己的 sdk

【一】Cocos2d-x PluginX的默认的使用方法

【1】开始准备阶段

1.准备工作

安装 gawk,教程:gawk 的安装

因为 mac 系统默认没有 gawk,所以这个必须安装,否则会造成执行时出错

2.配置 ndk,sdk 等环境

参考方法:便捷配置 ndk

这个只是后面编译的时候用,如果以前配置过,可以跳过这一步。

3.开始生成

比如你的工程是democ。

首先生成插件,cocos2d 默认会生成六个sdk,这是内置的,后面会说怎么加自己的sdk,移动到相应的插件目录

cd /Users/admin/Desktop/cocos2d-x-2.2.6/plugin/tools

然后执行 publish.sh

./publish.sh

这个会跳出让你配置的选项,你把 ndk,sdk,ant/bin 的路径填写上去即可,这三个是要下载的,mac 自己不带的,百度下ndk 下载会有提供下载的

执行完毕之后会在 plugin 的目录下生成一个 publish 的文件夹

然后执行 gameDevGuide.sh

./gameDevGuide.sh

这个会跳出一个界面选择,终端不用关闭

屏幕快照 2015-06-02 08.51.36.png

然后把相应的 project 的那个安卓路径填写上去即可,比如这个 democ,那么安卓路径就是工程的 proj.android 的那个路径

比如我的这个

/Users/admin/Desktop/cocos2d-x-2.2.6/projects/democ/proj.android

填写上去,然后点击 next

屏幕快照 2015-06-02 08.54.19.png

选择相应的插件, 点击 next 即可。

这是已经给你配置好了工程里面的Android.mk。

【2】导入阶段

首先在democ工程的proj.android/jni/hellocpp/main.cpp 里面修改加上这个代码

#include "PluginJniHelper.h" 
jint JNI_OnLoad(JavaVM *vm, void *reserved)
{
    JniHelper::setJavaVM(vm);
    PluginJniHelper::setJavaVM(vm);  // for plugins

    return JNI_VERSION_1_4;
}

然后执行 democ 工程的 proj.android 的 build_native.sh,但是会提示说没有合适的 NDK_MODULE_PATH,然后提醒的是 Android.mk 的最后一行,这个是因为没有配置。

解决方法

修改NDK_MODULE_PATH这个东西,官网上是这么说的

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

NDK_MODULE_PATH=${PLUGIN_ROOT}/publish:(冒号后面是原有值)

但是我根本就没有搞明白怎么设置额,所以就这么设置了。

设置democ 的proj.android/jni/Android.mk 文件,你会发现其实执行完gameDevGuide.sh后,它在后面加上了$(call import-module,protocols/android)这个,但是这个路径在执行时找不到,怎么解决呢,提供两个办法

第一种:直接写上完整的绝对路径【但是我建议的是使用第二种方法

protocols/android修改为plugin/publish/protocols/android.

第二种:在 democ 的 proj.android 文件夹下建立一个新的文件夹,命名为 plugin-x

命名为这个是有用的,然后把刚才生成的 publish 的文件夹下面的文件复制过来,像这样

屏幕快照 2015-06-02 09.12.04.png

屏幕快照 2015-06-02 09.12.15.png

之后开始修改 Android.mk 在加上这两句,

$(call import-add-path, $(LOCAL_PATH)/../plugin-x)
$(call import-add-path, $(LOCAL_PATH)/../plugin-x/protocols)

然后Android.mk 的后面的这一段就变成了这样的了。

include $(BUILD_SHARED_LIBRARY)

$(call import-add-path, $(LOCAL_PATH)/../plugin-x)
$(call import-add-path, $(LOCAL_PATH)/../plugin-x/protocols)
$(call import-module,cocos2dx)
$(call import-module,cocos2dx/platform/third_party/android/prebuilt/libcurl)
$(call import-module,CocosDenshion/android)
$(call import-module,extensions)
$(call import-module,external/Box2D)
$(call import-module,external/chipmunk)

$(call import-module,protocols/android)

这时候再执行 build_native.sh 就没问题了。

生成完毕之后,导入到 eclipse,记得把那个 org 文件复制到 proj.android/src 里面

org 文件的路径

/Users/admin/Desktop/cocos2d-x-2.2.6/cocos2dx/platform/android/java/src/org

然后修改你这个工程的active,就是工程下 src 的主的 java 工程,添加下面代码结构,就是那两行,

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());
    }
...
}

这样之后就配置完成了。

【3】开始使用

使用 xcode 打开相应工程,然后把工程里面的刚才复制的 public 的,就是 plugin-x 文件夹下面的那个 include 文件夹引入到工程中

点击查看原图

引入之后,工程里面有 include 这个文件夹

屏幕快照 2015-06-02 09.32.53.png

然后使用的时候在头文件引入这两个头文件

#include "ProtocolSocial.h" 
#include "PluginManager.h"

然后在使用的地方,首先声明一个对象,然后调用相应的方法即可,比如

void HelloWorld::menuCloseCallback(CCObject* pSender)
{
    if (CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID) {
    plugin::ProtocolSocial *pp=dynamic_cast<plugin::ProtocolSocial*>(plugin::PluginManager::getInstance()->loadPlugin("SocialQQWeibo"));//加载插件
    std::map <std::string,std::string> mapd;
    mapd["dd"]="ss";
    cocos2d::plugin::TShareInfo info=mapd;
    pp->share(info);//调用自带的 share 方法
    }
}

当然先不要急着使用上面的这个,因为上面的这个是自己添加的sdk,默认的是没有的。添加自定义sdk的方法看第二部分。

loadPlugin 里面传的是插件的名字,这个插件的名字是这么找到,

相应plugin的proj.android/src/org/cocos2dx/plugin/,会看到下面的.java文件。plugin的名字就是源文件名除去扩展名的部分。

就是那个 plugin 里面的 plugins 的文件夹里面

点击查看原图


【二】整合第三方SDK到Plugin-X

【1】准备阶段

plugin-x的核心代码在 /protocols目录下。


现在我们有4套协议:ProtocolAds, ProtocolAnalytics, ProtocolIAP, ProtocolSocial.

如果你想看每个协议的功能,直接进入protocols目录下的 include 找对应的头文件即可

如果你的SDK实现了相应的功能这将很简单。


你不需要编写任何C++代码。我们已经在核心代码中实现了它。你只需做下面的:

  • 创建一个新的Android、iOS工程

  • 编写java或OC代码实现我们已经定义的接口、协议。

首先在 plugin/plugins 里面创建一个空文件夹,比如为 demo,然后在里面创建文件夹 proj.android 和 proj.ios,这个一个是安卓,一个是 ios,可以只创建一个,名字必须是这样的


屏幕快照 2015-06-02 09.55.56.png

【2】开始导入

打开 eclipse,选择导入已有工程,选择导入plugin\protocols\proj.android

屏幕快照 2015-06-02 10.02.56.png

屏幕快照 2015-06-02 10.03.21.png

导入之后,就已经有了libPluginProtocol 这个

然后开始创建Library工程,并依赖于libPluginProtocol,以最多例子的 QQWeibo 为例

1.开始创建

屏幕快照 2015-06-02 10.08.59.png

New -> Android Application Project创建新工程

屏幕快照 2015-06-02 10.11.02.png

Application Name,Project Name为:libPluginQQWeibo,格式为libPlugin{XXX} ;

Package Name为:org.cocos2dx.libSocialQQWeibo,格式为org.cocos2dx.lib{Plugin类型}{Plugin标识}。

SDK 都选API 8,Theme:None。点击Next。

屏幕快照 2015-06-02 10.12.06.png

屏幕快照 2015-06-02 10.11.57.png

Mark this project as a library勾选,其余勾选都去掉。Location手动选择刚刚创建的Plugins 的那个proj.android目录。点击Finish。

2.实现Plugin,增加一些必要文件:

build.xml,直接从其它Plugin工程中复制,这是用来做Ant输出的编译配置。需要修改project name,如:

<project name="libPluginQQWeibo" default="plugin-publish">

ForManifest.xml,用来自动修改目标工程的Manifest.xml文件的,里面填写当前Plugin需要的xml修改内容,比如:权限、Activity声明,等等。直接复制后修改,参考自带Plugin中的格式。

sdk目录,把第三方SDK的.jar文件放入。

ForAssets、DependProject用途参考自带Plugin。

3.引入协议

右键点击 libPluginQQWeibo,选择Properties

屏幕快照 2015-06-02 10.13.01.png

在 Android 里面引入 protocol,要勾选 Is Library

屏幕快照 2015-06-02 10.14.14.png

4.实现Interface

必须创建一个实现Interface的java类,这个类中封装SDK的功能,要求如下:

右击src目录,New -> Package,Name:org.cocos2dx.plugin,不要有变化。

屏幕快照 2015-06-02 10.26.40.png

在这个Package下创建Java类文件,SocialQQWeibo,格式为{Plugin类型}{Plugin标识}。SuperClass空,Interface选择一个Plugin Interface类型,这里是InterfaceSocial。

屏幕快照 2015-06-02 10.28.47.png

这个类一定要提供一个以 Context 为参数的构造函数,如下:

	public SocialQQWeibo(Context context) {
	    mContext = context;
	}

当然这个mcontext 是要先声明的,举个例子

屏幕快照 2015-07-03 13.49.07.png

其余就是Interface的实现了,按第3方SDK文档实现即可,任意发挥。

当然说的是把sdk 的 jar 文件要复制到sdk 下面,其实是直接复制到 lib 下面的,这样就可以直接引用,不然我使用的时候发现在 sdk 目录下面引用不了

屏幕快照 2015-07-03 13.48.29.png

修改plugin/tools/config.sh,加入新的plugin目录名到ALL_PLUGINS变量,这样脚本会自动输出新增的plugin。

#define plugins array 
export ALL_PLUGINS=("flurry" "umeng" \
"alipay" "nd91" \
"admob" \
"demo" \
"twitter" "weibo")

然后再接入 publish 就可以了

【三】增加新的协议到plugin-x,比如说 login()登陆

这个请看另外的这个文章:Plugin-x自己增加新的接口(图文教程)

Last modification:January 1st, 1970 at 08:00 am
如果看了这个文章可以让你少加会班,可以请我喝杯可乐
已打赏名单
微信公众号

Leave a Comment