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
这个会跳出一个界面选择,终端不用关闭
然后把相应的 project 的那个安卓路径填写上去即可,比如这个 democ,那么安卓路径就是工程的 proj.android 的那个路径
比如我的这个
/Users/admin/Desktop/cocos2d-x-2.2.6/projects/democ/proj.android
填写上去,然后点击 next
选择相应的插件, 点击 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 的文件夹下面的文件复制过来,像这样
之后开始修改 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 这个文件夹
然后使用的时候在头文件引入这两个头文件
#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,可以只创建一个,名字必须是这样的
【2】开始导入
打开 eclipse,选择导入已有工程,选择导入plugin\protocols\proj.android
导入之后,就已经有了libPluginProtocol 这个
然后开始创建Library工程,并依赖于libPluginProtocol,以最多例子的 QQWeibo 为例
1.开始创建
New -> Android Application Project创建新工程
Application Name,Project Name为:libPluginQQWeibo,格式为libPlugin{XXX} ;
Package Name为:org.cocos2dx.libSocialQQWeibo,格式为org.cocos2dx.lib{Plugin类型}{Plugin标识}。
SDK 都选API 8,Theme:None。点击Next。
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
在 Android 里面引入 protocol,要勾选 Is Library
4.实现Interface
必须创建一个实现Interface的java类,这个类中封装SDK的功能,要求如下:
右击src目录,New -> Package,Name:org.cocos2dx.plugin,不要有变化。
在这个Package下创建Java类文件,SocialQQWeibo,格式为{Plugin类型}{Plugin标识}。SuperClass空,Interface选择一个Plugin Interface类型,这里是InterfaceSocial。
这个类一定要提供一个以 Context 为参数的构造函数,如下:
public SocialQQWeibo(Context context) { mContext = context; }
当然这个mcontext 是要先声明的,举个例子
其余就是Interface的实现了,按第3方SDK文档实现即可,任意发挥。
当然说的是把sdk 的 jar 文件要复制到sdk 下面,其实是直接复制到 lib 下面的,这样就可以直接引用,不然我使用的时候发现在 sdk 目录下面引用不了
修改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自己增加新的接口(图文教程)
版权属于:东哥笔记 - DongGe.org
本文链接:https://dongge.org/blog/164.html
自2017年12月26日起,『转载以及大段采集进行后续编辑』须注明本文标题和链接!否则禁止所有转载和采集行为!