Cocos2d-Lua(Quick-Cocos2d-x)集成第三方SDK(二)

2023-11-17

上一篇文章中,我们介绍了,怎么集成友盟的Cocos2d-x版本SDK,接下来我们来说下怎么将友盟的C++接口导出到Lua中使用。

引擎版本: Quick-Cocos2d-x 3.3 开发系统: Windows 7 64bit

编写.tolua文件

我们打开libMobClickCpp\include文件夹可以看到里面有两个文件,分别是:

1
2
MobClickCpp.h
MobClickJniHelper.h

打开这两个文件看他们的内容可以发现,MobClickJniHelper.h的内容中只有一个

1
static void setJavaVM(JavaVM *javaVM);

而在MobClickCpp.h中包含了我们基本上能使用的所有的umeng的接口,所以我们需要导出的接口其实就是MobClickCpp中的接口。

新建一个MobClickLua.tolua文件,将下面的内容复制进去,我们再来详细分析下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
$#include "MobClickCpp.h"
 
$ using namespace umeng;
 
class MobClickCpp {
public :
     static void setLogEnabled( bool value);
 
     static void setProxy( const char * host, int port);
 
     static void setSessionIdleLimit( int seconds);
 
     static void startWithAppkey( const char * appKey, const char * channelId = NULL);
 
     static void end();
 
     static void mainloop( float dt);
 
     static void event( const char * eventId, const char * label = NULL);
 
     static void beginLogPageView( const char *pageName);
     static void endLogPageView( const char *pageName);
 
     static void setUserLevel( const char *level);
 
     enum Sex{
         Unkonwn = 0,
         Male = 1,
         Female = 2,
     };
 
     static void setUserInfo( const char * userId, Sex sex, int age, const char * platform);
 
     static void startLevel( const char * level);
 
     static void finishLevel( const char * level);
 
     static void failLevel( const char * level);
 
     static void pay( double cash, int source, double coin);
 
     static void pay( double cash, int source, const char * item, int amount, double price);
 
     static void buy( const char *item, int amount, double price);
 
     static void use( const char * item, int amount, double price);
 
     static void bonus( double coin, int source);
 
     static void bonus( const char * item, int amount, double price, int source);
};

我们可以看到上面的内容基本上都是MobClickCpp.h文件中的接口。我们现在来详细说下这几个部分的意思。

第一部分的代码是:

1
$#include "MobClickCpp.h"

这里的代码是引用代码,需要包含的头文件可以填到这里。

第二部分是这一句:

1
$ using namespace umeng;

我们打开MobClickCpp.h的内容可以看到里面定义了一个命名空间为

1
2
3
namespace umeng{
 
}

为了能在转出来的.cpp文件中使用umeng的接口,我们需要把命名空间引用过去。所以这里加了这一句话方便在.cpp文件中使用umeng命名空间。

第三部分就是我们具体的类的定义了,这里最好是直接拷贝.h文件中的类的声明。当然,你想自己定义一个类来作为中间层,也可以声明为自定义的层。这个时候记得要修改第一部分和第二部分的代码。

将.tolua文件转为luabinding c++代码

在Quick-Cocos2d-x 3.3中自带了tolua++工具,位置在[QUICK_V3_ROOT]/quick/bin下面的win32或者是mac下,我们最好将它们都添加到系统的PATH环境变量中,方便下次使用。

在命令行下直接输入:

1
tolua++

可以看到tolua++的帮助信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
usage: tolua++ [options] input_file
 
Command line options are:
   -v       : print version information.
   -o  file : set output file; default is stdout.
   -H  file : create include file.
   -n  name : set package name; default is input file root name.
   -p       : parse only.
   -P       : parse and print structure information ( for debug).
   -S       : disable support for c++ strings.
   -1       : substract 1 to operator[] index ( for compatibility with tolua5).
   -L  file : run lua file (with dofile()) before doing anything.
   -D       : disable automatic exporting of destructors for classes that have
              constructors ( for compatibility with tolua5)
   -W       : disable warnings for unsupported features ( for compatibility
              with tolua5)
   -C       : disable cleanup of included lua code ( for easier debugging)
   -E  value[=value] : add extra values to the luastate
   -t       : export a list of types asociates with the C++ typeid name
   -q       : don't print warnings to the console
   -h       : print this message.
Should the input file be omitted, stdin is assumed;
in that case , the package name must be explicitly set.
 
aaaaaa

了解上面这些信息后,我们执行命令:

1
tolua++  -o lua_binding_MobClickCpp.cpp -H lua_binding_MobClickCpp.h MobClickCpp.tolua

执行完成后将会生成两个文件:

1
2
lua_binding_MobClickCpp.cpp
lua_binding_MobClickCpp.h

生成的两个文件就是我们将.tolua的描述信息转为lua_binding的接口之后的.cpp和.h文件,这两个文件既可以放到引擎的目录下也可以放到工程目录下,这里为了描述方面我就把它们放到工程目录下了。

添加C++代码到工程中

拷贝上面的两个文件到工程下的umeng\frameworks\runtime-src\Classes目录,然后打开proj.android_no_anysdk\jni下的Android.mk文件,给LOCAL_SRC_FILES加上 ../../Classes/lua_binding_MobClickCpp.cpp \,加上之后的LOCAL_SRC_FILES内容如下:

1
2
3
4
5
LOCAL_SRC_FILES := hellolua/main.cpp \
../../Classes/VisibleRect.cpp \
../../Classes/AppDelegate.cpp \
../../Classes/ConfigParser.cpp \
../../Classes/lua_binding_MobClickCpp.cpp \

添加Java代码(仅限Android)

打开proj.android工程中的AppActivity.java文件,在函数onCreate中添加下面的语句:

1
MobClickCppHelper.init( this );

添加C++代码

打开AppDelegate.cpp文件,添加头文件

1
2
#include "MobClickCpp.h"
#include "lua_binding_MobClickCpp.h"

然后再在函数 bool AppDelegate::applicationDidFinishLaunching()中添加以下代码:

1
tolua_MobClickCpp_open(L);

注意上面这一句添加的位置必须要在获取到lua_State之后。

接着分别在AppDelegate::applicationDidEnterBackgroundAppDelegate::applicationWillEnterForeground中分别添加

1
umeng::MobClickCpp::applicationDidEnterBackground();

1
umeng::MobClickCpp::applicationWillEnterForeground();

改完C++代码后,build_native编译C++代码。稍等片刻,我们等待C++编译完。

在Lua代码中使用umeng

我们打开Quick-Cocos2d-x工程中的MyApp.lua代码文件,修改function MyApp:run()的内容为:

1
2
3
4
5
6
7
function MyApp:run()
     cc.FileUtils:getInstance():addSearchPath( "res/" )
     self:enterScene( "MainScene" )
 
     MobClickCpp:startWithAppkey( "5539bb6767e58e62eb000288" , "GooglePlay" )
 
end

这里的 5539bb6767e58e62eb000288 是我们在umeng官网上创建APP的时候所给的AppKey。GooglePlay为我们所使用的渠道。

打开Eclipse,在手机上运行工程,我们可以在后台看到umeng的数据

umeng_data

打开应用的详细页面,点击渠道分析,里面有一个渠道列表的子选项,点击之后我们可以看到我们上传的渠道用户数量:

channel

好了,友盟的C++版本在Lua的使用就介绍到这里,其他umeng的接口大家可以看下MobClickCpp.h文件中查看接口说明。

下一篇我们看在Lua里直接使用Java版本的umeng接口。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cocos2d-Lua(Quick-Cocos2d-x)集成第三方SDK(二) 的相关文章

  • 安全移动 Microsoft SDK 文件夹

    我的硬盘上有一个文件夹 C Program Files Microsoft SDKs 我想知道将其移动到外部驱动器是否安全 Visual Studio 或任何其他工具是否依赖于此特定文件夹 注册表中有相当多的条目 至少在我的注册表中 指向该
  • .NET 3.5 SDK 位于哪里?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 谁能提供下载 NET 3 5 SDK 的链接吗 我检查了微软网站和谷歌 但找不到这个的下
  • 线程 1:信号 SIGABRT

    当我为 Xcode 项目运行模拟时出现上述错误 这出现在 O abort with payload 文件中 dyld abort with payload 0x10aae66f8 lt 0 gt movl 0x2000209 eax imm
  • 在 Flex SDK 上叠加 AIR SDK 后出现问题

    我尝试在 Windows 计算机上将 AIR SDK 覆盖到 Flex SDK 上 但之后遇到问题 我尝试覆盖两个 SDK 的多个官方版本 包括 Apache Flex SDK 并按照此处提到的步骤进行操作 http helpx adobe
  • 什么是 winapifamily.h?

    在 Windows SDK 和 DDK 中找不到它 但我们现有的一些代码包含它 我通过谷歌找到的唯一有意义的链接是 http msdn microsoft com en us library windows hardware hh45083
  • 注册不起作用 - 服务器返回 404 错误代码

    MongoDB Stitch iOS SDK 注册问题 我试过这个 let stitchClient StitchClient appId
  • Android Studio:Gradle 构建错误,无法找到 SDK 和编译服务器

    我是 Android Studio 的新用户 在尝试将 Android Studio 项目导入其他 PC 上的 Android Studio 时遇到严重问题 一般来说 我的 Gradle 不想构建项目 这是由路径问题引起的 错误日志 Fai
  • 如何使 UITextView 像 Notes 应用程序一样使用文本展开

    如何使 UITextView 随其内部的文本展开 你可以试试这个 UITextView textView your UITextView NSString text the text that you want to place in th
  • Android 4.3 虚拟设备 CPU/ABI - 未安装系统映像(eclipse)

    I m trying to set up a new device but I can not continue with the process I think it s because the target version is 4 3
  • 双击并滑动/拖动手指以放大/缩小

    如果有人使用过 iOS 版谷歌地图应用程序 那么它有一个很棒的功能 可以用一根手指放大 缩小 双击 uiscrollview 然后立即向上或向下滑动手指以放大 缩小 有谁知道这是如何实现的 谷歌发布了任何片段吗 我将此功能添加到我的 UIS
  • 如何使用Google API PHP SDK获取用户信息

    我正在尝试为拥有 Google 帐户的用户添加登录选项到我的网站 我已经能够实现这个 Facebook 但在使用 Google 获取用户帐户信息时遇到问题 我正在使用位于此处的 Google PHP SDK https github com
  • Facebook oauth/access_token 丢失

    不知道我是否错过了什么 但就这样 我正在尝试为我的应用程序获取 access token 以便它可以在 facebook 上查找某些公共群组的事件 而无需用户登录 我试图从中获取 access token 这将返回一个字符串 access
  • 无法使用 android.support.v7.widget.AppCompatTextView 实例化以下类

    最近我在 android studio 的应用程序中将我的 sdk 从 25 更改为 26 我在所有 xml 中都遇到了这个奇怪的错误 目前 该错误并没有以我能看到的任何方式影响我的应用程序 但每次我必须编辑或更改 xml 中的某些内容时
  • 如何使用 Microsoft Kinect for Windows SDK 版本 1.7 C# 检测张开/闭合的手

    我最近开始使用 Microsoft Kinect for Windows SDK 来使用 Kinect 设备来编程一些东西 我正在竭尽全力寻找一种方法来检测某只手是闭合还是打开 我看到了 Kinect for Windows Toolkit
  • Windows 上的 OpenGL SDK

    我正在尝试编写一个 OpenGL 应用程序 因此我安装了 Windows 7 SDK 然而 它似乎是OpenGL 1 1 define GL VERSION 1 1 1 如何找到我安装的 OpenGL 版本 dll 以及在哪里可以找到较新的
  • 显示来自 weburl iphone sdk 的 pdf

    我正在开发一个项目 我想显示网站上的 pdf 我有 pdf 的 url 知道如何做到这一点 我还想创建网站上 pdf 的缩略图 您可以在您的设备中显示 pdf 文件 直接将 url 传递给 UIWebView UIWebView webVi
  • 查看 Android 应用程序的共享首选项?

    当我在 Eclipse 中处理我的应用程序时 有没有办法在模拟器中调试时查看我对应用程序的共享首选项所做的更改 提前致谢 在模拟器中运行项目 然后从 Eclipse 选择菜单 Windows gt 打开透视图 gt DDMS 从选项卡设备中
  • 如何降低iphone的sdk Audioqueue的声音?

    我正在使用 Aran Mulhollan 的 RemoteIOPlayer 在 SDK iphone 中使用音频队列 我可以毫无问题 添加两个信号来混合声音 通过乘以从 wav 文件中获得的 UInt32 来增加音量 但所有其他操作都会给我
  • 免费的 Flex SDK 中是否提供 Flex 图表?

    嗯嗯 图表似乎只能通过 Flex Builder 内置的 Flex SDK 获得 这是一个问题 因为我想使用 Flex 3 3 而 Flex Builder 附带了 3 2 Eclipse 也让我很恼火 我更喜欢使用不同的 IDE Flas
  • eclipse中更新ADT后出错

    我的 eclipse 中 ADT 的最新版本是 API 16 所以我更新了 ADT eclipse gt Help gt Install new software gt Work with ADT 然后发生了多个错误 我什至无法打开 And

随机推荐

  • vector find() 用法

    int main vector
  • STM32的PA0输出高电平的具体库函数代码操作

    在STM32中 可以使用库函数控制PA0输出高电平 具体的代码如下 初始化GPIOA的引脚模式 设置PA0为输出模式 GPIO InitTypeDef GPIO InitStruct HAL RCC GPIOA CLK ENABLE GPI
  • Score SDE 三种随机微分方程代码解读

    定义SDE类 定义了7个子函数 T End time of the SDE sde marginal prob Parameters to determine the marginal distribution of the SDE p t
  • 计算机二级-简单应用题

    题目要求 编写代码 以实现如下功能 键盘输入小明学习的课程名称及考分等信息 信息间采用空格分隔 每个课程一行 空行回车结束录入 示例格式如下 数学 90 语文 95 英语 86 物理 84 生物 87 屏幕输出得分最高的课程及成绩 得分最低
  • 去除指定css属性

    使得指定css样式失效 layui btn background image initial important 优先使用 layui btn background image initial important padding 0 10p
  • 像程序员一样思考_如何像程序员一样思考-解决问题的经验教训

    像程序员一样思考 by Richard Reis 理查德 里斯 Richard Reis 如何像程序员一样思考 解决问题的经验教训 How to think like a programmer lessons in problem solv
  • Vue-router2.0基础,秒会。

    如果不是模块式开发 请先引入 1 0基础 div h1 Hello App h1 p p div
  • Docker打开远程API服务

    一 开发环境 1 系统环境 2 docker版本 二 步骤 1 查看docker配置文件路径 2 编辑配置文件 3 重启docker 三 测试 1 查看docker客户端服务端版本 docker H localhost 2375 versi
  • C++ 在一个程序中调用exe

    生成exe的代码 include
  • StarRocks 运维工具 StarGo

    优质资源分享 学习路线指引 点击解锁 知识定位 人群定位 Python实战微信订餐小程序 进阶级 本课程是python flask 微信小程序的完美结合 从项目搭建到腾讯云部署上线 打造一个全栈订餐系统 Python量化交易实战 入门级 手
  • Spring Boot Admin 监控告警

    Spring Boot Admin 监控告警 要进行监控 需要两个Project 一个是Admin Server端 负责监控Spring boot的项目 另一个是Admin Client端 是被监控的Spring boot服务 当然也可以一
  • Android优化

    一 布局优化 布局优化就是删除布局中无用的控件和层级 可以用Hierarchy Viewer工具来检测 其次有选择地使用性能较低的ViewGroup include标签 include标签只支持以android layout开头的属性 比如
  • Synchronized的三种写法

    文章目录 前言 一 synchronized是什么 二 synchronized的三种写法 1 同步代码块 2 在实例方法上使用synchronized 3 在静态方法上使用synchronized 总结 前言 总结一下自己在学习Synch
  • STA——multicycle path

    目录 0 多周期路径 1 发射时钟和捕获时钟相同 2 发射时钟和捕获时钟不同 3 examples 之前去地平线面试的时候被问到了multicycle path的一点问题 其实这个问题我应该知道 看过 Constraining Design
  • 【Linux】Linux Centos 7.6 离线RPM安装NTP(时间同步)服务器及基本配置

    文章目录 1 概述 2 安装 2 1 查看服务器 2 2 安装NTPDATE NTP服务 2 3 NTP相关配置 2 4 启动 20230118日 22点13分回到家 3年后第一次回家 发个博客纪念一下 1 概述 一个环境 因为需要需要nt
  • 语义分割之 数据标注

    语义分割之 数据标注 一 标注工具 二 Labelme 安装和启动 1 安装 2 启动 三 标注与保存 1 打开图像 2 标注 3 保存 4 修改 四 多类别标注 五 快捷键 数据标注的目的是为了在监督学习中告诉机器哪些东西是属于哪个类别或
  • 个人阅读的Deep Learning方向的paper整理

    http hi baidu com chb seaok item 6307c0d0363170e73cc2cb65 个人阅读的Deep Learning方向的paper整理 分了几部分吧 但有些部分是有交叉或者内容重叠 也不必纠结于这属于D
  • 《Stable Diffusion web UI ControlNet模型下载及使用》

    ControlNet模型下载 本来是很简单一两分钟搞定的事情 但是作者搞了7次才终于出来这个页面 每次下载完以后看文件也是有 stable diffusion webui extensions sd webui controlnet 但是在
  • 运维知识各种链接

    转自 https www cnblogs com uglyliu p 6185943 html 运维知识各种链接 http linuxtools rst readthedocs io zh CN latest tool sar html l
  • Cocos2d-Lua(Quick-Cocos2d-x)集成第三方SDK(二)

    在上一篇文章中 我们介绍了 怎么集成友盟的Cocos2d x版本SDK 接下来我们来说下怎么将友盟的C 接口导出到Lua中使用 引擎版本 Quick Cocos2d x 3 3 开发系统 Windows 7 64bit 编写 tolua文件