现在cocos2dx游戏开发中植入一键分享功能已经很常见了,玩家可以把玩游戏的截图和玩游戏的心情发送到微博、微信、QQ空间等。
而传统的方式,比如你要分享到新浪微博这一个平台、就要申请新浪微博开发者帐号,植入新浪微博的SDK。如果要分享到多个平台就要每个平台这么走一遭,很麻烦。
而我在实现这个功能时,发现友盟的社会化组件已经集成了很多平台了,到目前为止,有QQ空间、新浪微博、短信、腾讯微博、邮件、人人网、豆瓣网.所以现在我只要植入友盟这一个平台的SDK就可以了。当然你要植入其他的SDK流程也差不多。
虽然友盟这平台很方便,但是我在移植中遇到很多蛋疼的问题,被友盟漏洞百出的官方文档坑苦了。所以我记录了一下移植的过程。
首先,说一下,cocos2dx中实现分享功能流程的原理机制,比如你在游戏中点击分享按钮,该按钮的响应函数A是C++写的,而该响应函数A通过JNI机制调用Android 平台的响应函数B,而B是java写的(Android平台的JIN机制主要功能就是通过java代码调用C/C++代码,C/C++代码调用java代码)。
而这个java写的函数B会调用友盟封装好的一些jar包,来分享到不同平台。
首先cocos2dx,HelloWorld.cpp中响应函数A的写法如下:
void HelloWorld::shareButtonOnClick()
{
//判断是否是Android平台
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
JniMethodInfo methodInfo;
// 获取UmengGameActivity的静态方法openShareBoard
bool isHave = JniHelper::getStaticMethodInfo(methodInfo,"com/ymook/Helloworld/Helloworld", "openShareBoard", "()V");
if (isHave)
{
CCLog(" 函数B存在;");
// 实际调用UmengGameActivity中打开umeng分享平台选择面板
methodInfo.env->CallStaticVoidMethod( methodInfo.classID,methodInfo.methodID);
}
else
{
CCLog(" 函数B不存在;");
}
#endif
}
当然,在HelloWorld.h中要包含jni类和jniHelper类的头文件(JniHelper类是对jni类的再次封装,以便于我们使用JNI)
#include <jni.h>
#include "platform/android/jni/JniHelper.h"
再来说说上面用到的getStaticMethodInfo函数,该函数有4个参数,
第二个参数表示上面提到的函数B所在的类的路径
比如我的那个函数B所在的类文件名为Helloworld.java,路径如下:
那么第二个参数就该是"com/ymook/Helloworld/Helloworld"
第三个参数表示函数B的名称
第四个参数表示函数B的参数类型和返回类型。
看了第二三四个参数的作用,大家也猜得到第一个参数的作用了吧,第一个参数就是一个类的实例化对象,来保存调用函数B的相关信息。
再来看看在Android中函数B的添加位置以及写法(友盟提供的,这段代码暂时还没问题),函数B就是openShareBoard()函数,其他添加的是相关变量
/****************************************************************************
Copyright (c) 2010-2011 cocos2d-x.org
http://www.cocos2d-x.org
package com.ymook.Helloworld;
import org.cocos2dx.lib.Cocos2dxActivity;
import org.cocos2dx.lib.Cocos2dxGLSurfaceView;
import com.umeng.socialize.controller.RequestType;
import com.umeng.socialize.controller.UMServiceFactory;
import com.umeng.socialize.controller.UMSocialService;
import com.umeng.socialize.sso.QZoneSsoHandler;
import com.umeng.socialize.sso.SinaSsoHandler;
import com.umeng.socialize.sso.TencentWBSsoHandler;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
public class Helloworld extends Cocos2dxActivity{
/**
* Handler, 用于包装友盟的openShare方法,保证openShare方法在UI线程执行
*/
private static Handler mHandler = null;
/**
* 保存当前Activity实例, 静态变量
*/
private static Activity mActivity = null;
/**
* 友盟Social SDK实例,整个SDK的Controller
*/
private static UMSocialService mController = UMServiceFactory.getUMSocialService(
"com.aigcar", RequestType.SOCIAL);
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
mActivity=this;
}
public Cocos2dxGLSurfaceView onCreateView() {
Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this);
// Helloworld should create stencil buffer
glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8);
return glSurfaceView;
}
static {
System.loadLibrary("cocos2dcpp");
}
/**
* @Title: openShareBoard
* @Description:
* 调用友盟的openShare方法, 打开分享平台选择面板
* @throws
*/
public static void openShareBoard() {
mHandler = new Handler(Looper.getMainLooper());
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
if (mActivity != null) {
/**
* 设置新浪微博、QQ空间、腾讯微博的Handler,进行SSO授权
*
* 注意 : 新浪平台支持SSO则需要把友盟提供的com.sina.sso拷进src里面,
* 需要将友盟提供的libs、res文件拷贝到您的工程对应的目录里面.
*/
mController.getConfig().setSsoHandler(new SinaSsoHandler());
mController.getConfig().setSsoHandler(new QZoneSsoHandler(mActivity));
mController.getConfig().setSsoHandler(new TencentWBSsoHandler());
// 打开友盟的分享平台选择面板
mController.openShare(mActivity, false);
}
}
}, 100);
}
}
最后一步,就是在你src里建一个com.sina.sso包,并把下载的RemoteSSO.aidl拷贝进去
然后再将下载的libs、res两个文件夹替换Android工程的原来的文件夹。
好了最后截图一张留念: