友盟cocos2dx游戏数据统计SDK接入记录
因为之前接入的友盟SDK为较老版本,而且是纯iOS版的,发现友盟已经更新了cocos2dx版的SDK,遂打算接入,然后统一封装安卓和iOS, 暴露给lua使用.
软件环境:
- cocos2d-x: 2.1.x
- 友盟游戏统计SDK: For cocos2dx的最新版(V4.1 非idfa版 ) 下载地址
- 友盟官方文档: 文档地址
前期准备:
SDK下载后, 先把SDK解压后的文件夹拷贝到工程目录的合适的位置,官方的文档里给了个建议的目录, 犹豫我们使用的是较老的cocos版本, 所以这里就可以按照自己的实际情况来处理
iOS的接入
导入SDK
在游戏工程文件对应的target的【build phases】里的【Link Binary With Library】中添加解压后的ios目录里的libMobClickCppWithLibCpp.a
文件,注意这里官方文档里写的是libMobClickCpp.a
,但是这里官方文档是错误的,直接导入前者就可以了,否则会产生很多链接错误,至少在我使用的2.1.x的版本里是这样的。
封装luaWrapper
原本打算直接使用quickcocos2dx里的封装文件,结果发现它里面使用的umeng的SDK版本好像不是最新的, 会有各种编译链接问题, 于是决定自己封装一个,源码在这源码地址 使用tolua++导出后就可以给lua使用了。其中installAndStart
这个函数是我添加的为了让lua在启动时可以进行初始化组件的工作,比如设置appKey什么的, 省的每次都得在cpp层做这件事儿
添加一些必要的处理代码
由于以上已经实现了在lua层的初始化组件,所以剩下的就只需要在applicationDidEnterBackground
中加入
umeng::MobClickCpp::applicationDidEnterBackground();
在applicationWillEnterForeground
中加入
umeng::MobClickCpp::applicationWillEnterForeground();
在CCDirector::sharedDirector()->end();
结束游戏前调用
umeng::MobClickCpp::end();
CCDirector::sharedDirector()->end();
以上这些处理方法和官方处理的一致, 当然也可以更近一步我们也把这些处理在lua层做, 这个以后有时间了我可以试试
Android接入
导入sdk
先在.classpath里合适的位置导入sdk中的mobclickcpphelper.jar
, 这个视具体自己的情况而定, 操作步骤晚上也能搜到。 在工程的Android.mk文件里添加cpp的库, 如下
LOCAL_SHARED_LIBRARIES += mobclickcpp_static
这里官方文档写的是错误的, 写成了:
LOCAL_SHARED_LIBRARIES := mobclickcpp_shared
mobclickcpp_shared
是不存在的,我也是通过翻查libMobClickCpp目录里的Android.mk
看到的, 如下:
LOCAL_MODULE := mobclickcpp_static
然后接下来的call module和官方文档一致:
$(call import-module,libmobclickcpp)
当然这些里得注意路径的问题,很多时候是因为相对路径找不到对应的文件导致的
修改Java代码
在游戏主Activity
的onCreate
方法中中加入如下代码:
MobClickCppHelper.init(this);
注意要import对应的类,如下(官方文档并没有给出,自己反编jar包找到的package路径):
import com.umeng.mobclickcpp.MobClickCppHelper;
官方文档还说还得添加以下代码:
static {
MobClickCppHelper.loadLibrary();
}
但是实际上添加后会报错说找不到loadLibrary
这个函数, 反编jar后发现确实没有这个函数, 所以这里就不需要了.
修改main.cpp
这里官方文档并没有说需要修改main.cpp, 但是发现如果只做完以上步骤后,编译通过运行时会黑屏崩溃。 用adb logcat抓取log后分析发现,在JNI访问jvm时空指针崩溃, 于是想到sdk目录里有个MobClickJniHelper.h
文件,官方文档没有提到这个文件的用途, 于是搜索该文件里的setJavaVM发现在proj.android里的main.cpp文件里的JNI_OnLoad
函数中, 有如下代码:
JniHelper::setJavaVM(vm);
在该文件中 include MobClickJniHelper.h
这个文件, 然后在JNI_OnLoad
函数中, 改为如下:
jint JNI_OnLoad(JavaVM *vm, void *reserved)
{
JniHelper::setJavaVM(vm);
umeng::MobClickJniHelper::setJavaVM(vm);
return JNI_VERSION_1_4;
}
至此, 问题解决
总结
正果过程中, 首先是需要将SDK导出给lua 使用, 其次是官方文档实在是太老旧,造成了很多奇怪的问题,遇到这些问题时, 仔细分析一下结合现象基本就能解决,重点是要看log