cocos2dx Android植入友盟分享功能

      现在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工程的原来的文件夹。

好了最后截图一张留念:


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。