本文转自http://blog.umeng.com/index.php/2013/09/android-cocos2d-x/
最近在帮助开发者集成友盟社会化组件SDK的过程中,发现Cocos2d-x游戏在集成过程中不是很顺利,因此整理了一篇关于Android Cocos2d-x游戏集成友盟社会化分享组件的文章,按照本文集成,就可以轻松实现分享到微信、QQ、新浪微博、Facebook、Twitter、Google+等社交平台的功能。由于本人水平有限,有什么错误或者有更好的方法希望大家指出,以帮助其他开发者更好的集成。
友盟社会化组件需要依赖于Activity,因此需要在你的Cocos2d-x游戏Activity ( 继承自Cocos2dActivity )中进行调用, 步骤如下 :
前提 : 添加友盟社会化组件 Android SDK的jar文件、res资源以及相应的AndroidManifest.xml配置, 参考友盟社会化组件SDK在线文档 ;
步骤一、在游戏Activity中定义一个静态方法, 如下示例 :
package com.umeng.game ; ...... public class UmengGameActivity 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); /** * onCreate方法 */ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mActivity = this; } /** * 载入cocos2d-x的c++代码,这里命名为umenggame */ static { System.loadLibrary("umenggame"); } /** * @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); } }
工程目录如下所示 :
图 1
步骤二、在jni层中实现调用Android中的UmengGameActivity的openShareBoard方法
例如在这里我们命名为openUmengShareJni , 所在头文件为”yourjni.h”, 实现文件为YourJni.cpp.
...... // 实现代码 void YourJni::openUmengShareJni() { JniMethodInfo methodInfo ; // 获取UmengGameActivity的静态方法openShareBoard bool isHave = JniHelper::getStaticMethodinfo( methodInfo, “com/umeng/game/UmengGameActivity”, “openShareBoard”, “()V”) ; if ( isHave ) { // 实际调用UmengGameActivity中打开umeng分享平台选择面板 methodInfo.env->CallStaticVoidMethod( methodInfo .classID, methodInfo.methodID ); } } ......
步骤三、 在Cocos2d-x的UmengGameScene(派生自CCLayer的类,需要替换成你对应的类)中声明一个按钮, 使得点击该按钮时打开友盟的分享平台选择面板.( 这里需要include 步骤二中定义jni方法openUmengShareJni 的头文件 )
......
include “yourjni.h”
......
bool UmengGameScene::init()
{
// 代码省略......
/**
* 创建分享按钮
* 参数1 : 正常状态的图片
* 参数2 : 按下去时的图片
* 参数3 : 回调函数所在的类
* 参数4 : 按钮点击触发的函数
*/
CCMenuItemImage *umengShareBtn = CCMenuItemImage::create( "start_normal.png",
"start_pressed.png", this, menu_selector(AppDelegate::openUmengShare));
// 设置按钮显示位置
umengShareBtn->setPosition( ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));
// 将按钮添加到菜单中
CCMenu *menu = CCMenu::menuWithItems(umengShareBtn, NULL);
menu->setPosition(CCPointZero);
// 将按钮添加到场景中
this->addChild(menu,1);
return true ;
}
// 按钮的回调函数
void UmengGameScene::openUmengShare()
{
// 调用jni方法
openUmengShareJni();
}