现在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 #include platform/android/jni/JniHelper.h再来说说上面用到的getStaticMethodInfo函数,该函数有4个参数, 第二个参数表示上面提到的函数B所在的类的路径 比如我的那个函数B所在的类文件名为Helloworld.java,路径如下: \第三个参数表示函数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工程的原来的文件夹。好了最后截图一张留念: \
cocos2dx jar
最新推荐文章于 2018-08-25 09:23:06 发布