友盟cocos2dx游戏数据统计SDK接入记录

友盟cocos2dx游戏数据统计SDK接入记录

因为之前接入的友盟SDK为较老版本,而且是纯iOS版的,发现友盟已经更新了cocos2dx版的SDK,遂打算接入,然后统一封装安卓和iOS, 暴露给lua使用.

软件环境:

  1. cocos2d-x: 2.1.x
  2. 友盟游戏统计SDK: For cocos2dx的最新版(V4.1 非idfa版 ) 下载地址
  3. 友盟官方文档: 文档地址

前期准备:

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代码

在游戏主ActivityonCreate方法中中加入如下代码:

	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

转载于:https://my.oschina.net/pigsoldier/blog/472174

你可能感兴趣的:(友盟cocos2dx游戏数据统计SDK接入记录)