如何在Cocos2d-x中集成安卓版微信SDK

2023-10-27

本文转载于:http://www.cocoachina.com/bbs/read.php?tid=224616

1.概述


微信的火热程度已不必说了,如果能在Cocos2d-x中集成微信SDK,让游戏能分享给好友或者朋友圈,那对游戏推广将会是非常有利的。好了,本文就是手把手地教大伙如何在Cocos2d-x中集成微信SDK。

先看下效果

分享给好友,点击即可跳转链接:

 
分享到朋友圈,点击即可跳转链接:

 

2.环境
  • OS: Mac OSX
  • IDE: Xcode v5.11 and Eclipse ADT v22.3
  • Android SDK:4.3
  • Adnroid NDK:r9d
  • Cocos2d-x 3.2release

3.创建Cocos2d-x工程

这里不再详述,网上的资料多如牛毛了。这里我按自己习惯的方式来。

(1)命令行创建Cocos2dxWechat项目
复制代码
  1. $ cocos new -p com.fusijie.cocos2dxwechat -l cpp -d . Cocos2dxWechat

(2)交叉编译生成so文件

复制代码
  1. $ cd Cocos2dxWechat/proj.android/
  2. $ ./build_native.py

(3)导入Eclipse生成APK
导入libcocos2dx项目和Cocos2dxWechat项目到Eclipse中。在真机中成功运行Cocos2dxWechat.apk。

4.申请创建微信应用

这一步主要是在微信开放平台上申请创建移动应用,获取AppID。微信开放平台的网址是: https://open.weixin.qq.com/

(1)注册帐号,进入管理中心,点击创建移动应用。

(2)第一步是填写应用名,描述,图标等等。如下图。

 
(3)填写应用官网,勾选Android应用,填写签名,包名等等。如下图。

 
注意:

这里需要特别注意的是应用签名这一项。在第三步的时候,真机中成功运行Cocos2dxWechat.apk之后,我们需要从微信开放平台下载一个签名生成软件GenSignature(资源下载->Android资源下载)。

安装签名生成后,打开软件输入游戏包名获取即可。

 
这里的签名和游戏的包名和keystore是相关联的,如果修改了包名或者更换了keystore,必须同步更新微信开放平台管理中心的信息,防止失效。本示例采用的是debug签名。在完成以上工作后,提交审核即可。说是7天,实际上一般1~2天就审核过了。

5.集成微信SDK

刚才都是铺垫,这里开始才是进入主题了。要在Cocos2d-x调用微信安卓SDK,Jni跑不掉的。这里只演示如何进行分享到朋友圈和分享给好友,微信SDK还有很多高级的功能,如支付,收藏等等接口,有需要自行 参考文档(移动应用开发) 进行开发。

这里主要分成3部分来解释:
  • 微信SDK下载,jar包导入
  • Android代码
  • C++代码

(1)下载微信SDK

资源下载->Android资源下载

(2)打开下载的Android_SDK.zip。解压,将lib目录下的wechat-sdk-android-with-meta-1.1.7.jar拷到Cocos2dxWechat项目下的libs目录。

(3)右键单击工程,选择Build Path中的Configure Build Path...,选中Libraries这个tab,并通过Add Jars...导入工程libs目录下的wechat-sdk-android-with-meta-1.1.7.jar文件。

 

(4)在AppActivity中添加成员变量

//APP_ID 替换为你的应用从官方网站申请到的合法appId
	private static final String APP_ID = "wxa89a9535d05c0b22";
	
	//IWXAPI 是第三方app和微信通信的openapi接口
	private static IWXAPI api;
	
	//类静态实例,为了方便后面静态函数的调用
	private static AppActivity context;


(5)注册到微信

打开AppActivity,在onCreate()中调用regToWX()注册到微信

@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		Log.v("onCreate", "AppActivity onCreate");
		context = this;
		regToWX();
	}
	
	private void regToWX() {
		api = WXAPIFactory.createWXAPI(this, APP_ID, true);
		api.registerApp(APP_ID);
	}


(6)由于这里采用的分享示例传递了一张icon,所以需要额外的一个bitmap的解析类Util类,这个类可以到微信官方SDK demo下载,也可以在本示例中下载(早期的SDK版本这个类是集成在微信SDK中)。icon放在res目录下的drawable目录,我这里偷个懒直接使用了应用icon。

(7)分享给好友

private static void sendMsgToFriend() {
		Log.v("sendMsgToFriend", "AppActivity sendMsgToFriend");
		if(api.openWXApp()) {
			WXWebpageObject webpage = new WXWebpageObject();
			webpage.webpageUrl = "http://www.baidu.com";
			WXMediaMessage msg = new WXMediaMessage(webpage);
			msg.title = "Title";
			msg.description = "Description";
			
			Bitmap thumb = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon);
			msg.thumbData = Util.bmpToByteArray(thumb, true);
			
			SendMessageToWX.Req req = new SendMessageToWX.Req();
			req.transaction = buildTransaction("webpage");
			req.message = msg;
			req.scene = SendMessageToWX.Req.WXSceneSession;
			api.sendReq(req);
		} else {
			Toast.makeText(context, "未安装微信", Toast.LENGTH_LONG).show();
		}
	}


(8)分享到朋友圈

private static void sendMsgToTimeLine() {
		Log.v("sendMsgToTimeLine", "AppActivity sendMsgToTimeLine");
		if(api.openWXApp()) {
			if(api.getWXAppSupportAPI() >= 0x21020001) {
				WXWebpageObject webpage = new WXWebpageObject();
				webpage.webpageUrl = "http://www.baidu.com";
				WXMediaMessage msg = new WXMediaMessage(webpage);
				msg.title = "Title";
				msg.description = "Description";
				
				Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon);
				msg.thumbData = Util.bmpToByteArray(bitmap, true);
				
				SendMessageToWX.Req req = new SendMessageToWX.Req();
				req.transaction = buildTransaction("webpage");
				req.message = msg;
				req.scene = SendMessageToWX.Req.WXSceneTimeline;
				api.sendReq(req);
			} else {
				Toast.makeText(context, "微信版本过低", Toast.LENGTH_SHORT).show();
			}
		} else {
			Toast.makeText(context, "未安装微信", Toast.LENGTH_LONG).show();
		}
	}


其中buildTransaction()用于生成一个唯一的会话标识符。

private static String buildTransaction(final String type) {
		return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
	}

代码不难,所以不再逐行解释,可以参考 SDK文档

(9)JNI调用

在Classes目录下新建一个WeixinShare类,主要包含2个静态函数:

#include "WeixinShare.h"
#if (CC_TARGET_PLATFORM== CC_PLATFORM_ANDROID)
#include "platform/android/jni/JniHelper.h"
#endif
USING_NS_CC;
void WeixinShare::sendToFriend()
{
#if (CC_TARGET_PLATFORM== CC_PLATFORM_ANDROID)//判断当前是否为Android平台
JniMethodInfo minfo;

bool isHave= JniHelper::getStaticMethodInfo(minfo,"org/cocos2dx/cpp/AppActivity","sendMsgToFriend","()V");

if (!isHave){
log("jni:sendMsgToTimeLine is null");
}else{
//调用此函数
minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);
}
#endif
}

void WeixinShare::sendToTimeLine()
{
#if (CC_TARGET_PLATFORM== CC_PLATFORM_ANDROID)//判断当前是否为Android平台
JniMethodInfo minfo;

bool isHave= JniHelper::getStaticMethodInfo(minfo,"org/cocos2dx/cpp/AppActivity","sendMsgToTimeLine","()V");

if (!isHave){
log("jni:sendMsgToTimeLine is null");
}else{
//调用此函数
minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);
}
#endif
}



(10)Cocos2d-x使用

这个就比较简单了,只要包含这个WeixinShare类,调用这两个静态函数即可。

void HelloWorld::menuCloseCallback(Ref*pSender)
{
#if (CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)
WeixinShare::sendToFriend();
//WeixinShare::sendToTimeLine();
#endif
    
}


(11)Android.mk的修改
最后不要忘记修改Android.mk文件。
复制代码
  1. LOCAL_SRC_FILES := hellocpp/main.cpp \
  2.                ../../Classes/AppDelegate.cpp \
  3.                ../../Classes/HelloWorldScene.cpp \
  4.                ../../Classes/WeixinShare.cpp

(12)重新交叉编译,打包为APK即可

6.总结

本文写的比较详细,但是也忽略了比如如何接收微信的请求及返回值的说明以及如何进行混淆等等,算是一个初级教程吧。主要是面向对jni调用,第三方安卓sdk集成不太了解的朋友。这里虽然只是针对微信sdk的部分功能集成进行说明,但是道理都是共通的,如何集成微博分享,如何集成第三方广告等等,用类似的方法都可以实现。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Cocos2d-x中集成安卓版微信SDK 的相关文章

  • 如何以编程方式将访问键(快捷方式)添加到 WPF ContextMenu?

    我已经有以下内容 var myContextMenu new System Windows Controls ContextMenu var exitItem new MenuItem exitItem Header E xit exitI
  • 如何在 ASP.NET MVC 中将 XML 文件发送到客户端

    在 ASP NET MVC 中 我有一个数据库表 我想在某个视图页面上有一个按钮 如果某个用户单击该按钮 我的应用程序将生成包含数据库中所有行的 XML 文件 然后 应将包含 XML 的文件发送到客户端 以便用户看到下载弹出窗口 同样 我希
  • 采用 std::vector 或 std::array 的模板函数

    我有一个函数 当前接受 2 个向量 其中可以包含任何普通的旧数据 template
  • getline 之后返回到文件开头

    所以我已经从文件中读取了所有行 while getline ifile line logic 其中 ifile 是 ifstream line 是字符串 我的问题是我现在想再次使用 getline 并且似乎无法返回到文件的开头 因为运行 c
  • Qt/c++ 随机字符串生成[重复]

    这个问题在这里已经有答案了 我正在创建一个应用程序 需要生成多个随机字符串 几乎就像一个由一定长度的 ASCII 字符组成的唯一 ID 这些字符混合有大写 小写 数字字符 有没有 Qt 库可以实现这一点 如果没有 在纯 C 中生成多个随机字
  • Winform DatagridView 数字列排序

    我只使用一个简单的 DataGridView 来保存一堆数据 有趣的是 我在特定列中有小数 但是当按小数列排序时 它的排序是错误的 例如 起始顺序可能是 0 56 3 45 500 89 20078 90 1 56 100 29 2 39
  • 对 ExecuteNonQuery() 的单次调用是原子的

    对 ExecuteNonQuery 的单次调用是否是原子的 或者如果单个 DbCommand 中有多个 sql 语句 那么使用事务是否有意义 请参阅我的示例以进行说明 using var ts new TransactionScope us
  • 选择initializer_list迭代器定义

    Why std initializer list
  • 从内存流播放视频文件

    只是好奇看看这是否可能 我有一个 Windows 应用程序 它从我的电脑上的 avi 文件读取所有字节 然后将其存储在 byte 中 现在我的内存中有 avi 文件 我想直接从内存将其加载到某种视频播放器控件中 我尝试过使用 wmplaye
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • 如何在 Visual Basic DLL 和 C++ DLL 之间创建隔离/免注册 COM?

    我必须在 C DLL 中使用 VB COM DLL 我弄清楚了如何从 C DLL 访问 VB COM DLL 并且它可以工作 现在我遇到了一个问题 我必须使用隔离的 COM 免注册 COM 因为我无法在必须使用它的每台 PC 上注册 DLL
  • 检查两个函数或成员函数指针的签名是否相等

    我编写了一些代码来检查自由函数的签名是否等于成员函数的签名等 它比较提取的返回类型和函数参数 include
  • 本地时间的内存需要释放吗?

    void log time t current time 0 tm ptm localtime current stuf 只是想确定 我是否需要在方法结束时释放 tm 指针分配的内存 不 你不应该释放它 该结构是静态分配的 检查文档 htt
  • 冒号在c中起什么作用?

    我在课堂上得到了这个例子 但我不确定它的作用 我知道冒号添加了一个位字段 但我仍然不确定这个问题 a b gt 0 3 1 运算符称为条件运算符 If b值为 gt 0 价值3被分配给a否则值1被分配给a 以 Kernighan Ritch
  • 如果finally 块包含await,为什么*有时*不会在ThreadAbortException 上执行?

    UPDATE 我不认为这个问题是重复的ThreadAbortException最后可以跳过吗 https stackoverflow com questions 18002668 can threadabortexception skip
  • 在特定线程上运行工作

    我想要一个特定的线程 任务队列并在该单独的线程中处理任务 应用程序将根据用户的使用情况创建任务并将其排队到任务队列中 然后单独的线程处理任务 即使队列为空 保持线程活动并使用它来处理排队任务也至关重要 我尝试过几种实现TaskSchedul
  • 'iter' 的名称查找已更改为新的 ISO 'for' 范围

    我正在尝试编译下面的两个文件 但从编译器收到错误消息 gcc 4 3 3 Linux 错误位于带有以下符号的行 LINE WITH ERROR 我做错了什么 我该怎么改变 路易斯 g c b h b cpp b cpp In functio
  • 强制函数调用的顺序?

    假设我有一个抽象基类 并且我想要一个必须由派生类实现的纯虚方法 但我想确保派生方法以特定顺序调用函数 我可以做什么来强制执行它 I E base class virtual void doABC 0 virtual void A 0 vir
  • Asp.Net Core 中的 SSL 不起作用

    我从 Visual Studio 创建了一个简单的 Web 应用程序Web Application Net Core 具有个人用户帐户授权的模板 然后 我启用了 SSLProject gt MyProject Properties 将带有
  • 如何通过API退出Win32应用程序?

    我有一个使用 Win32 API 编写的 C Win32 应用程序 我希望强制它在其中一个函数中退出 有没有类似的东西Exit or Destroy or Abort 类似的东西会终止它吗 哎呀呀呀呀呀呀 不要做任何这些事情 exit 和

随机推荐

  • 小白学习python——numpy

    零 初识numpy 1 numPy Numerical Python 即数值Python包 是Python进行科学计算的一个基础包 所以是一个掌握其他Scipy库中模块的基础模块 一定需要先掌握该包的主要使用方式 官网 http www n
  • 猿创征文

    内存管理实现单链表的插入和删除 1 收获 2 什么是单链表 3 节点的创建 4 主函数的实现 5 子函数的实现 5 1 AollocNode的实现 5 2 HeadInsertNode的实现 5 3 ShowNode的实现 5 4 Head
  • KB2871997补丁绕过

    KB2871997补丁绕过 微软为了防止用户的明文密码在内存中泄露 发布了KB2871997补丁 关闭了Wdigest功能 Windows Server2012及以上版本默认关闭Wdigest 使攻击者无法从内存中获取明文密码 Window
  • 24. 两两交换链表中的节点

    给你一个链表 两两交换其中相邻的节点 并返回交换后链表的头节点 你必须在不修改节点内部的值的情况下完成本题 即 只能进行节点交换 输入 head 1 2 3 4 输出 2 1 4 3 示例 2 输入 head 输出 示例 3 输入 head
  • php 验证只能输入姓名,php 检查输入用户名是否符合规定示例

    这篇文章主要为大家详细介绍了php 检查输入用户名是否符合规定示例 具有一定的参考价值 可以用来参考一下 对php检查输入的用户名是否符合规定感兴趣的小伙伴 下面一起跟随512笔记的小编两巴掌来看看吧 php检查输入的用户名是否符合规定 p
  • 【热门框架】Mybatis-Plus条件查询的三种格式

    Mybatis Plus 提供了三种常用的条件查询方式 分别是 Wrapper QueryWrapper LambdaQueryWrapper Wrapper Wrapper 是一个接口 提供了若干个构造方法 可以用来构建 where 条件
  • C++可变参数模板

    可变参数模板 接受可变数目参数的模板函数或模板类 将可变数目的参数成为参数包 有模板参数包和函数参数包 模板参数包 表示零个或多个模板参数 函数参数包 表示零个或多个函数参数 例如 template
  • 数据挖掘note(1)

    数据挖掘一般分为机器学习和统计学习 大数据学的课程一般是关于机器学习 我们学的浅 主要关于统计学习 示意图如下所示 这是一个大数据时代 但是数据挖掘的利用率不足0 5 可见数据挖掘的空间巨大 问题 数据挖掘对信息安全有什么用 例如从几十万条
  • VTM2.0+360lib-7.0配置环境

    全景视频编码跟普通的视频编码不一样 在VTM平台下还需要配置一个360lib 这里贴一下VTM和360lib的地址 VTM下载地址 360lib下载地址 提示一下 VTM可以直接在网站上下载zip版本 360lib要svn的方法下载 下载下
  • 戏开发unity编译和调试系列:The type or namespace name ‘NativeList<>‘ could not be found

    The type or namespace name NativeList lt gt could not be found are you missing a using directive or an assembly referenc
  • intellij idea如何将基于Springboot的web项目打成war包

    intellij idea如何将基于Springboot的web项目打成war包 详细内容请参看 https ms200 cn p 791
  • flink接入Kafka报错:timeout expired while fetching topic metadata

    简单的flink接入kafka结果报错 代码 create env val env StreamExecutionEnvironment getExecutionEnvironment set parallelism env setPara
  • 测试员不可不知的几款bug管理工具

    根据每个公司性质的不同 规模的不同 所用到的bug管理工具也可能不同 你们用的bug管理工具是什么呢 下面介绍几款主流的bug管理工具 1 JIRA 付费 JIRA JIRA的生产者把JIRA定义为Professional Issue Tr
  • Git:Git中的分支管理

    文章目录 分支是什么 创建分支 分支切换 合并分支 删除分支 合并冲突 合并模式 分支策略 bug分支 强制删除分支 本篇主要总结的是Git中的分支管理 分支是什么 在Git中 一个强大的功能就是分支 由前面的学习可以知道 当我们每次进行c
  • Java中double精度丢失如何处理

    图片来自网络 代码审查 CodeReview 是一种可以有效提高代码质量的方法 他可以帮助团体提高产品代码质量 提高产品的稳定性 更容易维护的代码会带来更少的技术债务 从整体上看 提高了软件开发和迭代的效率 double精度丢失现象 程序开
  • HashMap面试相关问题

    1 HashMap的底层实现原理 HashMap的底层是数组 链表的方式 通过Hash算法决定每个元素的存储位置 当程序执行map put 方法时 系统会调用hashcode 方法来得到他的hash值 通过hash值来确定该元素的存储位置
  • 网络基础:路由器工作原理

    目录 一 理论 1 路由器工作原理 2 路由表获取方式 3 路由器和交换机的区别 二 实验 1 华为系统配置2台路由器 2 华为系统配置3台路由器 3 华为系统配置浮动路由 一 理论 1 路由器工作原理 路由器工作在OSI七层协议中的第三层
  • AD画PCB时如何修改编辑区(黑色部分)

    今天同事提出这个问题 心中暗喜 又到我发光的时候了 结果 WHAT 没研究明白 小姐姐明明之前会N种方法的呀 赶紧问度娘 问题解决 应该是ad不同版本指令不太一样了 方法一 直接在KEEPOUT层画出想要的板框大小 方向 选中状态 执行DE
  • linux C错误汇集

    问题一 22 c In function main 22 c 8 9 error empty character constant 解决方法 少了空格 问题2 没有连接到math函数库 gcc 12 c o 12 lm 问题3 segmen
  • 如何在Cocos2d-x中集成安卓版微信SDK

    本文转载于 http www cocoachina com bbs read php tid 224616 1 概述 微信的火热程度已不必说了 如果能在Cocos2d x中集成微信SDK 让游戏能分享给好友或者朋友圈 那对游戏推广将会是非常