如何在cocos2d ios微信登录-x游戏接入IOS登录模块

iOS游戏编程之从零开始—Cocos2d-x与cocos2d引擎游戏开发pdf下载_爱问共享资料
iOS游戏编程之从零开始—Cocos2d-x与cocos2d引擎游戏开发.pdf
简介:本文档为《iOS游戏编程之从零开始—Cocos2d-x与cocos2d引擎游戏开发pdf》,可适用于IT书籍领域,主题内容包含iOS游戏编程之从零开始Cocosdx与cocosd引擎游戏开发李华明编著清华大学出版社北京II内容简介iOS平台游戏开发是目前移动游戏开发最热门的符等。
(window.slotbydup=window.slotbydup || []).push({
id: '4090793',
container: s,
size: '920,90',
display: 'inlay-fix'
iOS游戏编程之从零开始—Cocos2d-x与cocos2d引擎游戏开发.pdf
iOS游戏编程之从零开始—Cocos2d-x与cocos2d引…
下载1763次
阅读量2415
简介:本文档为《iOS游戏编程之从零开始—Cocos2d-x与cocos2d引擎游戏开发pdf》,可适用于IT书籍领域,主题内容包含iOS游戏编程之从零开始Cocosdx与cocosd引擎游戏开发李华明编著清华大学出版社北京II内容简介iOS平台游戏开发是目前移动游戏开发最热门的符等。
(window.slotbydup=window.slotbydup || []).push({
id: '4090793',
container: s,
size: '920,90',
display: 'inlay-fix'
《怦然心动的人生整理魔法》不是一本普通的整理书,是一本心灵疗愈的奇书。从精神层面到整理方法俱全。一旦整理,就不会变乱的整理方法,使人通过整理找回人生决断力,找到最初的梦想,找到怦然心动的幸福人生。
大家在下载时,点击“下载”后,请给反应时间。不要连续点击,这样很容易把文件点死。
该数据来源于网络,请勿用于商业用途,否则后果自负。版权属于原出版者和原作者原译者。仅供学术研究参考,请于下载后60秒钟内自行删除。
中药,以及化学学科资料
The Feynman Lectures on Physics
在此可输入您对该资料的评论~
阅读量:737
阅读量:541
阅读量:278
阅读量:908
阅读量:303
阅读量:918
阅读量:733
阅读量:807
阅读量:275
阅读量:893
资料评价:
所需积分:21. 新增扫二维码功能,可直接扫 VeryCD 网站影片页面的二维码,便能在应用上打开;
2. 新增支持 B 站视频(哔哩哔哩),满屏的弹幕更欢乐;
1. 新增支持 B 站视频(哔哩哔哩),满屏的弹幕更欢乐;
2. 在影片封面上展示在线视频的清晰度;
您的位置:
主讲人:&对白语言:&文字语言:&
收藏资源后,一旦有新更新(字幕、文件)我们
将会用站内消息和电子邮件通知你。
收藏资源后,一旦有新更新(字幕、文件)我们
将会用站内消息和电子邮件通知你。
基于cocos2d的IOS游戏开发与实践(共50小时)
cocos2d-x跨平台游戏开发教程(共40小时)
<td align="center" class="emulesize post2" id="size_EM52ccbcf.9GB
中文名:&两套基于cocos2d的游戏开发教程:《基于cocos2d的IOS游戏开发与实践》《cocos2d-x跨平台游戏开发课程》别名:&《cocos2d-x跨平台手机游戏开发》,《IOS游戏开发教程》,《iPhone游戏开发教程》资源格式:&MP4主讲人:&地区:&对白语言:&文字语言:&简介:&
--------------------------------------------------------------------------------------------------------《基于Cocos2D的iOS游戏开发进阶与实战课程》内容介绍:appstore推荐榜游戏《人人都能弹吉他》的开发者丁群老师讲解。针对人群:初学iOS游戏开发者,有经验的iOS游戏开发者,对iPhone iPad游戏开发感兴趣的软件工程师,基础良好的在读研究生或者即将毕业的应届毕业生,Andriod开发工程师, 希望拓展到iOS游戏开发。学习门槛:C/C++ 达到能够使用水平,学过Object C更好。这套课程能够让你学习到独立开发一个商业游戏的方方面面,包括游戏制作,内置社交功能,内置支付功能,功能设计思考,上传appstore注意事项,推广和运营等等。真正的让你完成自己的第一款商业手机游戏 。全部干货的50个小时,让我们一起开始吧!课程首先会通过编写一个打飞机小游戏来讲解Cocos2d基本功能。然后通过讲解&人人都能弹吉他&游戏中的部分代码和运行实例, 教给学员开发商业游戏的实战经验和技巧(第四阶段) , 以及常用功能(第五阶段)。--------------------------------------------------------------------------------------------------------全部课程在线观看地址:--------------------------------------------------------------------------------------------------------课程掌握后的能力值概述(技能目标):学完后具备相当于2年iOS游戏开发经验1、巩固Object C语言中独特的语法 2、掌握Cocos2d游戏引擎, 能基于它开发产品 3、熟悉iOS应用开发工具Xcode, Instruments 4、掌握游戏开发常用工具: TexturePacker, Particle Designer, Glyph Designer 5、掌握iOS游戏开发中实战技能: 解决bug, 内存优化, 性能优化.
6、掌握iOS游戏中常见功能的开发方法 7、能够开始独立开发小规模的商业游戏讲师介绍:丁群独立游戏&人人都能弹吉他&的开发者8年的手机软件开发经验: iOS, Android, Symbian。10年软件开发经验: Object C, C/C++, Java, Python, shell。Android手机软件系统工程师。专注领域:iOS, Android 游戏开发--------------------------------------------------------------------------------------------------------《cocos2d x跨平台游戏开发课程》内容介绍:(掌握cocos2d x开发教程后,你能独立开发出跨当前各个主流平台(android/WP8/IOS等)游戏)有C/C++基础即可学习。cocos2d x开发教程内容共分为5个阶段:第一阶段:主要了解、认识游戏开发,并为游戏开发做好准备工作;第二阶段:学习如何使用cocos2d-x引擎进行进行游戏开发,它包含了cocos2d-x引擎各个方面的基础知识点;第三阶段:学习游戏开发中一些常用的技术,包括网络,安全,优化,编辑器等运用,以及结合移动设备的特点和当前的市场环境,将游戏做得受欢迎;第四阶段:主要针对游戏引擎本身进行分析,以满足游戏开发中的各种扩展需要,甚至是开发和完善引擎本身;第五阶段:主要结合实际的商业项目,让大家掌握游戏开发的全过程,包括策划,构架,管理等,以便能独立完成商业及游戏项目。补充网盘下载地址:/share/link?uk=&shareid= 电驴不给力的时候,请使用百度网盘下载资源--------------------------------------------------------------------------------------------------------课程在线观看地址:--------------------------------------------------------------------------------------------------------关注 官方公众微信号:microoh(微信通讯录→添加→查找公众号)二维码:关注 麦可网微博:
获取课程最新信息;官方QQ:3968830,关注空间了解最新行业资讯或--------------------------------------------------------------------------------------------------------作者介绍:杨丰盛移动互联网探索者!游戏开发者!游戏制作人!《Android应用开发秘籍》、《Android技术内幕:系统卷》两本书的作者。内容截图:Cocos2d x游戏引擎核心开发者–杨丰盛,作为演讲嘉宾参与了2012 cocos2d x举办的成都沙龙活动,并在沙龙上做了技术分享与解答。Cocos2d-x技术分享:
-----------------------------------------------------------------------------------------------------------课程大纲下载地址: -----------------------------------------------------------------------------------------------------------麦可网 其他资源:Sundy's 《Android开发教程 深入浅出》《Sundy--Android嵌入式底层开发课程共享版》:《Windows phone 8 高级编程技术》:《Android高级应用开发课程》-----------------------------------------------------------------------------------------------------------
正在读取……
这里是其它用户补充的资源():
暂无补充资源
使用 BBCODE()
类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
勿催片。请相信驴友们对分享是富有激情的,如果确有更新版本,您一定能搜索到。
请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
如果您发现自己的评论不见了,请参考以上4条。
刚收藏了本资源的用户 (1209)
正在读取……
上海隐志网络科技有限公司
打个分吧:
留点口水(可选):cocos2d-x 2.x版本接入bugly的总结
最开始项目使用的是自己DIY的很简陋的上报系统,后来改成google breakpad来上报,发现其实都做的不太理想,游戏引擎因为版本历史问题存在一些崩溃问题。后来3.x接入了bugly,我这边抽了几天时间也准备接入,在接入bugly之前我是想用BugTags的,说实话我特别喜欢也为这款产品点赞(它的技术人员、客服人员响应速度和服务都是很赞的,最开始公司总结5个人,我也担任过客服的角色去跟用户沟通知道这其中的不易),但是毕竟它目前为止对NDK以及Lua方面支持的比较弱,而且截图时还存在黑屏的现象,对非原生的应用不太友好,所以后来还是放弃了,转入对C++崩溃捕获更为专业的Bugly。 官方采用的是3.x版本的cocos接入和测试的,所以2.x版本上有一些问题,我们对引擎底层做了一些修改,不能直接升级引擎的版本。 主要遇到的几个坑点: 1、CrashReport.mm报错 enum error is not a class or namespace,官方应该是在支持C++11的编译器上写的代码; 2、头文件引入的问题,No such file or directory compilation terminated,主要是.mk编写的问题; 3、eclipse属性C++ builder中勾选clean后,每次build都会把libs/armeabi目录下的文件删的精光,每次生成的时候libBuly.so都被干掉了,游戏一遇到上报就直接闪退;
第一个问题处理的方法,就是不要加类名。可参考C++11FAQ /C++11FAQ.html
第二个问题的解决方法就是修改bugly下的Android.mk文件,增加一行代码 LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) 后来测试中发现光export出来是不行的,还得include,可以在bugly Android.mk中引入,也可以在项目需要引入bugly相关头文件的mk中引入,类似下图
第三个问题就比较恶心一些了, 最后我是直接在项目jni/Android.mk中再引入一个Android.mk,通过该文件去导入libBugly.so文件 2.x的cocos需要配置NDK的环境变量,项目的jni/Android.mk中添加
Android.mk的文件内容 LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := Bugly_sharedLOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libBugly.soinclude $(PREBUILT_SHARED_LIBRARY) armeabi中就放入从官方下载的libBugly.so文件,注意要是armeabi目录下的,别搞错了哦 说几个我主要修改的地方吧,崩溃接入其实分了三个部分: 1、Java代码异常,你在Activity的onCreate()方法中调用测试代码就可以测试了:CrashReport.testJavaCrash(); 2、Lua Error,需要修改CCLuaEngine.cpp文件,执行lua出错时调用出错函数__G__TRACKBACK__; 3、C/C++异常; 第一个没什么好说的,自己看官方文档吧,很简单
第二个贴一下我修改的代码,仅供参考
主要就是利用lua_pcall最后一个参数为errFn进行的。当lua执行出错时,会调用相应的lua函数__G__TRACKBACK__,由该函数中调用bugly自己暴露出来的接口上传
第三项,因为bugly自己新起了一个线程去调用进行上报,在Android下如果游戏自己的CPP去调用BuglyReport.h中的方法就会直接崩溃,所以对官方提供的CrashReport.mm进行了修改(主要二处改动,一处是初始化仅做暴露自己接口的事情,二是对C++调用Java方法的判断) #include &string.h&#ifdef CC_TARGET_PLATFORM#include &cocos2d.h&#endif#include &CrashReport.h&#if (BUGLY_REPORT_LUA)#include &CCLuaEngine.h&//#include &CCScriptSupport.h&#endif#define CATEGORY_LUA_EXCEPTION 6#define CATEGORY_JS_EXCEPTION 7#define LOG_TAG &CrashReport&#if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32#define LOGI CCLOG#define LOGD CCLOG#define LOGE CCLOG#endif#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include &android/log.h& #include &jni.h& #include &platform/android/jni/JniHelper.h& #define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, fmt, ##args) #define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, fmt, ##args) #define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, fmt, ##args) #define CRASHREPORT_CLASS &com/tencent/bugly/cocos/Cocos2dxAgent& #define METHOD_INIT &initCrashReport& #define METHOD_INIT_PARAMETER &(Landroid/content/CLjava/lang/SZ)V& #define METHOD_POST_EXCEPTION &postException& #define METHOD_POST_EXCEPTION_PARAMETER &(ILjava/lang/SLjava/lang/SLjava/lang/SZ)V& #define METHOD_SET_USER_ID &setUserId& #define METHOD_SET_USER_ID_PARAMETER &(Ljava/lang/S)V& #define METHOD_SET_LOG &setLog& #define METHOD_SET_LOG_PARAMETER &(ILjava/lang/SLjava/lang/S)V& #define METHOD_SET_USER_SCENE_TAG &setUserSceneTag& #define METHOD_SET_USER_SCENE_TAG_PARAMETER &(Landroid/content/CI)V& #define METHOD_PUT_USER_DATA &putUserData& #define METHOD_PUT_USER_DATA_PARAMETER &(Landroid/content/CLjava/lang/SLjava/lang/S)V& #define METHOD_REMOVE_USER_DATA &removeUserData& #define METHOD_REMOVE_USER_DATA_PARAMETER &(Landroid/content/CLjava/lang/S)V& #define METHOD_SET_CHANNEL &setSDKPackagePrefixName& #define METHOD_SET_CHANNEL_PARAMETER &(Ljava/lang/S)V&#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) #import &Foundation/Foundation.h& #define NSStringMake(const_char_pointer) (const_char_pointer == NULL ? nil : @(const_char_pointer)) #define NSStringNonnullMake(const_char_pointer) (const_char_pointer == NULL ? @&& : @(const_char_pointer)) #define LOGI(fmt, args...) printf(&[Info] %s: &, LOG_TAG);/ printf(fmt, ##args);/ printf(&/n&); #define LOGD(fmt, args...) printf(&[Debug] %s: &, LOG_TAG);/ printf(fmt, ##args);/ printf(&/n&); #define LOGE(fmt, args...) printf(&[Error] %s: &, LOG_TAG);/ printf(fmt, ##args);/ printf(&/n&); #define BUGLY_AGENT_CLASS @&BuglyAgent& #define BUGLY_AGENT_METHOD_INIT @&initWithAppId:debugMode:& #define BUGLY_AGENT_METHOD_INIT_LOG @&initWithAppId:debugMode:logger:& #define BUGLY_AGENT_METHOD_USER @&setUserIdentifier:& #define BUGLY_AGENT_METHOD_CHANNEL @&setAppChannel:& #define BUGLY_AGENT_METHOD_VERSION @&setAppVersion:& #define BUGLY_AGENT_METHOD_EXCEPTION @&reportException:name:message:stackTrace:userInfo:terminateApp:& #define BUGLY_AGENT_METHOD_SCENE @&setSceneTag:& #define BUGLY_AGENT_METHOD_SCENE_VALUE @&setSceneValue:forKey:& #define BUGLY_AGENT_METHOD_SCENE_CLEAN @&removeSceneValueForKey:& #define BUGLY_AGENT_METHOD_LOG @&level:tag:log:&#endifbool CrashReport::initialized =void CrashReport::initCrashReport(const char* appId, bool isDebug) { CrashReport::initCrashReport(appId, isDebug, Warning);}void CrashReport::initCrashReport(const char* appId, bool isDebug, CRLogLevel level) { if (!initialized) { // #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) // LOGI(&[cocos2d-x] start init.&); // initialized = // JavaVM* jvm = cocos2d::JniHelper::getJavaVM(); // if (jvm == NULL) { // LOGE(&[cocos2d-x] JavaVM is null.&); // // } // JNIEnv* env = NULL; // jvm-&GetEnv((void**)&env, JNI_VERSION_1_6); // if (env == NULL) { // LOGE(&[cocos2d-x] JNIEnv is null.&); // // } // jvm-&AttachCurrentThread(&env, 0); // //get activity // LOGI(&[cocos2d-x] try get org.cocos2dx.lib.Cocos2dxActivity&); // jclass activityClass = env-&FindClass(&org/cocos2dx/lib/Cocos2dxActivity&); // if (activityClass == NULL) { // LOGE(&[cocos2d-x] Cocos2dxActivity is Null&); // // } // jmethodID methodActivity = env-&GetStaticMethodID(activityClass, &getContext&, &()Landroid/content/C&); // jobject activity = (jobject) env-&CallStaticObjectMethod(activityClass, methodActivity); // if (activity == NULL) { // LOGE(&[cocos2d-x] activity is Null&); // // } // //call channel set package name // #if(SDK_CHANNEL_INDEX != 0) // LOGI(&[cocos2d-x] set channel: %d&, SDK_CHANNEL_INDEX); // char* packageName = &&; // switch(SDK_CHANNEL_INDEX) { // case 1: // packageName = &com.tencent.bugly.msdk&; // // } // jmethodID setChannelMethod = env-&GetStaticMethodID(env-&FindClass(CRASHREPORT_CLASS), METHOD_SET_CHANNEL, METHOD_SET_CHANNEL_PARAMETER); // LOGI(&set packagename: %s&, packageName); // env-&CallStaticVoidMethod(env-&FindClass(CRASHREPORT_CLASS), setChannelMethod, env-&NewStringUTF(packageName)); // #endif // //call init // LOGI(&[cocos2d-x] init by bugly.jar&); // jmethodID initMethod = env-&GetStaticMethodID(env-&FindClass(CRASHREPORT_CLASS), METHOD_INIT, METHOD_INIT_PARAMETER); // env-&CallStaticVoidMethod(env-&FindClass(CRASHREPORT_CLASS), initMethod, activity, env-&NewStringUTF(appId), isDebug); // // iOS // #elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) // NSString* pAppId = NSStringMake(appId); // BOOL pDebug = isDebug ? YES : NO; // Class clazz = NSClassFromString(BUGLY_AGENT_CLASS); // if (clazz) { // BOOL initLog = // SEL selector = NSSelectorFromString(BUGLY_AGENT_METHOD_INIT_LOG); // NSMethodSignature* signature = [clazz methodSignatureForSelector:selector]; // if (signature == nil) { // selector = NSSelectorFromString(BUGLY_AGENT_METHOD_INIT); // signature = [clazz methodSignatureForSelector:selector]; // initLog = // } // if (signature) { // LOGI(&Init the sdk with App ID: %s&, appId); // NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:signature]; // [invocation setTarget:clazz]; // [invocation setSelector:selector]; // [invocation setArgument:&pAppId atIndex:2]; // [invocation setArgument:&pDebug atIndex:3]; // if (initLog) { // NSInteger pLevel = (level &= 4 ? 1 : (level == 3 ? 2 : (level == 2 ? 4 : (level == 1 ? 8 : 16)))); // [invocation setArgument:&pLevel atIndex:4]; // } // [invocation invoke]; // } // } else { // NSLog(@&Warning: Fail to get class by NSSelectorFromString(%@)&, BUGLY_AGENT_CLASS); // } // #endif // register lua handler#if (BUGLY_REPORT_LUA) lua_register(getLuaState(), &buglyReportLuaException&, buglyReportLuaException); lua_register(getLuaState(), &buglyPutUserData&, buglyLuaPutUserData); lua_register(getLuaState(), &buglyRemoveUserData&, buglyLuaRemoveUserData); lua_register(getLuaState(), &buglySetUserSceneTag&, buglyLuaSetUserSceneTag); lua_register(getLuaState(), &buglySetUserId&, buglyLuaSetUserId); lua_register(getLuaState(), &buglyLog&, buglyLuaLog); LOGI(&[cocos2d-x] registered bugly lua functions, init finished&);#endif#if (BUGLY_REPORT_JS)#endif initialized = }}void CrashReport::setUserSceneTag(int tag) {#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) cocos2d::JniMethodI if (cocos2d::JniHelper::getStaticMethodInfo(t, CRASHREPORT_CLASS, METHOD_SET_USER_SCENE_TAG, METHOD_SET_USER_SCENE_TAG_PARAMETER)) { LOGI(&[cocos2d-x] set user scene tag: %d&, tag); //get activity jclass activityClass = t.env-&FindClass(&org/cocos2dx/lib/Cocos2dxActivity&); if (activityClass == NULL) { LOGE(&[cocos2d-x] Cocos2dxActivity is Null&); } jmethodID methodActivity = t.env-&GetStaticMethodID(activityClass, &getContext&, &()Landroid/content/C&); jobject activity = (jobject) t.env-&CallStaticObjectMethod(activityClass, methodActivity); if (activity == NULL) { LOGE(&[cocos2d-x] activity is Null&); } t.env-&CallStaticVoidMethod(t.classID, t.methodID, activity, tag); }#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) if (tag & 0) { } NSUInteger pTag = Class clazz = NSClassFromString(BUGLY_AGENT_CLASS); if (clazz) { SEL selector = NSSelectorFromString(BUGLY_AGENT_METHOD_SCENE); NSMethodSignature* signature = [clazz methodSignatureForSelector:selector]; if (signature) { LOGI(&Set user scene tag id: %d&, tag); NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:signature]; [invocation setTarget:clazz]; [invocation setSelector:selector]; [invocation setArgument:&pTag atIndex:2]; [invocation invoke]; } } else { NSLog(@&Warning: Fail to get class by NSSelectorFromString(%@)&, BUGLY_AGENT_CLASS); }#endif}void CrashReport::putUserData(const char* key, const char* value) {#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) cocos2d::JniMethodI if (cocos2d::JniHelper::getStaticMethodInfo(t, CRASHREPORT_CLASS, METHOD_PUT_USER_DATA, METHOD_PUT_USER_DATA_PARAMETER)) { LOGI(&[cocos2d-x] put user data: %s:%s&, key, value); //get activity jclass activityClass = t.env-&FindClass(&org/cocos2dx/lib/Cocos2dxActivity&); if (activityClass == NULL) { LOGE(&[cocos2d-x] Cocos2dxActivity is Null&); } jmethodID methodActivity = t.env-&GetStaticMethodID(activityClass, &getContext&, &()Landroid/content/C&); jobject activity = (jobject) t.env-&CallStaticObjectMethod(activityClass, methodActivity); if (activity == NULL) { LOGE(&[cocos2d-x] activity is Null&); } t.env-&CallStaticVoidMethod(t.classID, t.methodID, activity, t.env-&NewStringUTF(key), t.env-&NewStringUTF(value)); }#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) NSString * pKey = NSStringNonnullMake(key); NSString * pValue = NSStringNonnullMake(value); Class clazz = NSClassFromString(BUGLY_AGENT_CLASS); if (clazz) { SEL selector = NSSelectorFromString(BUGLY_AGENT_METHOD_SCENE_VALUE); NSMethodSignature* signature = [clazz methodSignatureForSelector:selector]; if (signature) { LOGI(&Set user Key-Value: [%s, %s]&, key, value); NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:signature]; [invocation setTarget:clazz]; [invocation setSelector:selector]; [invocation setArgument:&pValue atIndex:2]; [invocation setArgument:&pKey atIndex:3]; [invocation invoke]; } } else { NSLog(@&Warning: Fail to get class by NSSelectorFromString(%@)&, BUGLY_AGENT_CLASS); }#endif}void CrashReport::removeUserData(const char* key) {#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) cocos2d::JniMethodI if (cocos2d::JniHelper::getStaticMethodInfo(t, CRASHREPORT_CLASS, METHOD_REMOVE_USER_DATA, METHOD_REMOVE_USER_DATA_PARAMETER)) { LOGI(&[cocos2d-x] remove user data: %s&, key); //get activity jclass activityClass = t.env-&FindClass(&org/cocos2dx/lib/Cocos2dxActivity&); if (activityClass == NULL) { LOGE(&[cocos2d-x] Cocos2dxActivity is Null&); } jmethodID methodActivity = t.env-&GetStaticMethodID(activityClass, &getContext&, &()Landroid/content/C&); jobject activity = (jobject) t.env-&CallStaticObjectMethod(activityClass, methodActivity); if (activity == NULL) { LOGE(&[cocos2d-x] activity is Null&); } t.env-&CallStaticVoidMethod(t.classID, t.methodID, activity, t.env-&NewStringUTF(key)); }#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) NSString * pKey = NSStringNonnullMake(key); Class clazz = NSClassFromString(BUGLY_AGENT_CLASS); if (clazz) { SEL selector = NSSelectorFromString(BUGLY_AGENT_METHOD_SCENE_CLEAN); NSMethodSignature* signature = [clazz methodSignatureForSelector:selector]; if (signature) { NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:signature]; [invocation setTarget:clazz]; [invocation setSelector:selector]; [invocation setArgument:&pKey atIndex:2]; [invocation invoke]; } } else { NSLog(@&Warning: Fail to get class by NSSelectorFromString(%@)&, BUGLY_AGENT_CLASS); } #endif}void CrashReport::setUserId(const char* userId) {#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) cocos2d::JniMethodI if (cocos2d::JniHelper::getStaticMethodInfo(t, CRASHREPORT_CLASS, METHOD_SET_USER_ID, METHOD_SET_USER_ID_PARAMETER)) { LOGI(&[cocos2d-x] set user id: %s&, userId); t.env-&CallStaticVoidMethod(t.classID, t.methodID, t.env-&NewStringUTF(userId)); }#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) NSString * pUserId = NSStringMake(userId); Class clazz = NSClassFromString(BUGLY_AGENT_CLASS); if (clazz) { SEL selector = NSSelectorFromString(BUGLY_AGENT_METHOD_USER); NSMethodSignature* signature = [clazz methodSignatureForSelector:selector]; if (signature) { LOGI(&Set user id: %s&, userId); NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:signature]; [invocation setTarget:clazz]; [invocation setSelector:selector]; [invocation setArgument:&pUserId atIndex:2]; [invocation invoke]; } } else { NSLog(@&Warning: Fail to get class by NSSelectorFromString(%@)&, BUGLY_AGENT_CLASS); }#endif}void CrashReport::reportException(int category, const char* type, const char* msg, const char* traceback) {#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) cocos2d::JniMethodI if (cocos2d::JniHelper::getStaticMethodInfo(t, CRASHREPORT_CLASS, METHOD_POST_EXCEPTION, METHOD_POST_EXCEPTION_PARAMETER)) { LOGI(&ReportException %d %s %s %s&, category, type, msg, traceback); jstring typeStr = t.env-&NewStringUTF(type); jstring msgStr = t.env-&NewStringUTF(msg); jstring traceStr = t.env-&NewStringUTF(traceback); t.env-&CallStaticVoidMethod(t.classID, t.methodID, category, typeStr, msgStr, traceStr, false); t.env-&DeleteLocalRef(typeStr); t.env-&DeleteLocalRef(msgStr); t.env-&DeleteLocalRef(traceStr); }#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) NSUInteger pCategory = NSString * pType = NSStringMake(type); NSString * pMsg = NSStringMake(msg); NSString * pTraceStack = NSStringMake(traceback); NSDictionary * nullObject = BOOL terminateApp = NO; Class clazz = NSClassFromString(BUGLY_AGENT_CLASS); if (clazz) { SEL selector = NSSelectorFromString(BUGLY_AGENT_METHOD_EXCEPTION); NSMethodSignature* signature = [clazz methodSignatureForSelector:selector]; if (signature) { LOGE(&Report exception: %s, %s/n%s&, type, msg, traceback); NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:signature]; [invocation setTarget:clazz]; [invocation setSelector:selector]; [invocation setArgument:&pCategory atIndex:2]; [invocation setArgument:&pType atIndex:3]; [invocation setArgument:&pMsg atIndex:4]; [invocation setArgument:&pTraceStack atIndex:5]; [invocation setArgument:&nullObject atIndex:6]; [invocation setArgument:&terminateApp atIndex:7]; [invocation invoke]; } } else { NSLog(@&Warning: Fail to get class by NSSelectorFromString(%@)&, BUGLY_AGENT_CLASS); }#endif}void CrashReport::setAppChannel(const char * channel){#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) LOGI(&No impl&);#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) NSString * pUserId = NSStringMake(channel); Class clazz = NSClassFromString(BUGLY_AGENT_CLASS); if (clazz) { SEL selector = NSSelectorFromString(BUGLY_AGENT_METHOD_CHANNEL); NSMethodSignature* signature = [clazz methodSignatureForSelector:selector]; if (signature) { LOGI(&Set channel: %s&, channel); NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:signature]; [invocation setTarget:clazz]; [invocation setSelector:selector]; [invocation setArgument:&pUserId atIndex:2]; [invocation invoke]; } }#endif}void CrashReport::setAppVersion(const char * version){#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) LOGI(&No impl&);#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) NSString * pUserId = NSStringMake(version); Class clazz = NSClassFromString(BUGLY_AGENT_CLASS); if (clazz) { SEL selector = NSSelectorFromString(BUGLY_AGENT_METHOD_VERSION); NSMethodSignature* signature = [clazz methodSignatureForSelector:selector]; if (signature) { LOGI(&Set version: %s&, version); NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:signature]; [invocation setTarget:clazz]; [invocation setSelector:selector]; [invocation setArgument:&pUserId atIndex:2]; [invocation invoke]; } }#endif}void CrashReport::log(CRLogLevel level, const char * tag, const char * fmts, ...) {#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) cocos2d::JniMethodI if (cocos2d::JniHelper::getStaticMethodInfo(t, CRASHREPORT_CLASS, METHOD_SET_LOG, METHOD_SET_LOG_PARAMETER)) { LOGI(&[cocos2d-x] set log: %s - %s&, tag, fmts); t.env-&CallStaticVoidMethod(t.classID, t.methodID, (int)level, t.env-&NewStringUTF(tag), t.env-&NewStringUTF(fmts)); }#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) if (NULL == fmts) { } //Error=4,Warn=3,Info=2,Debug=1,Verbose=0 //LogError=1&&0,Warn=1&&1,Info=1&&2,Debug=1&&3,Verbose=1&&4 NSInteger pLevel = (level &= 4 ? 1 : (level == 3 ? 2 : (level == 2 ? 4 : (level == 1 ? 8 : 16)))); NSString * pTag = NSStringMake(tag); char msg[256] = {0}; va_ va_start(args, fmts); vsprintf(msg, fmts, args); va_end(args); NSString * pMsg = NSStringMake(msg); Class clazz = NSClassFromString(BUGLY_AGENT_CLASS); if (clazz) { SEL selector = NSSelectorFromString(BUGLY_AGENT_METHOD_LOG); NSMethodSignature* signature = [clazz methodSignatureForSelector:selector]; if (signature) { NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:signature]; [invocation setTarget:clazz]; [invocation setSelector:selector]; [invocation setArgument:&pLevel atIndex:2]; [invocation setArgument:&pTag atIndex:3]; [invocation setArgument:&pMsg atIndex:4]; [invocation invoke]; } }#endif }//special for lua#if (BUGLY_REPORT_LUA)int CrashReport::buglyReportLuaException(lua_State* luaState) { const char* type = &&; const char* msg = lua_tostring(luaState, 1); const char* traceback = lua_tostring(luaState, 2); CrashReport::reportException(CATEGORY_LUA_EXCEPTION, type, msg, traceback); return 0;}int CrashReport::buglyLuaPutUserData(lua_State* luaState) { const char* key = lua_tostring(luaState, 1); const char* value = lua_tostring(luaState, 2); CrashReport::putUserData(key, value); return 0;}int CrashReport::buglyLuaRemoveUserData(lua_State* luaState) { const char* key = lua_tostring(luaState, 1); CrashReport::removeUserData(key); return 0;}int CrashReport::buglyLuaSetUserSceneTag(lua_State* luaState) { int tag = lua_tonumber(luaState, 1); CrashReport::setUserSceneTag(tag); return 0;}int CrashReport::buglyLuaSetUserId(lua_State* luaState) { const char* userId = lua_tostring(luaState, 1); CrashReport::setUserId(userId); return 0;}int CrashReport::buglyLuaLog(lua_State* luaState) { int level = lua_tonumber(luaState, 1); const char* tag = lua_tostring(luaState, 2); const char* logStr = lua_tostring(luaState, 3); CRLogLevel crLevel = V switch (level) { case 0: crLevel = V case 1: crLevel = D case 2: crLevel = I case 3: crLevel = W case 4: crLevel = E } CrashReport::log(crLevel, tag, logStr); return 0;}lua_State* CrashReport::getLuaState() { #if COCOS2D_VERSION &= 0x return cocos2d::LuaEngine::getInstance()-&getLuaStack()-&getLuaState(); #else return cocos2d::CCScriptEngineManager::sharedManager()-&getScriptEngine()-&getLuaState(); #endif}#endif// special for js#if (BUGLY_REPORT_JS)#endif 我自己做测试是通过的,截图如下:
IOS接入遇到的坑,初始化注意延时处理,防止崩溃 初始化Bugly,处理处理防止崩溃,修改AppController.mm //bugly#import &Bugly/CrashReporter.h&#import &Bugly/BuglyLog.h&#define BUGLY_APP_ID @&XXXXXXXXXXXXXXXXX&- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ BJMPlatformUtil::ForceToPortrait(); //NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); cocos2d::CCApplication::sharedApplication().run(); //bugly 延迟3秒初始化 [self performSelector:@selector(setupBugly) withObject:nil afterDelay:3]; return YES;}- (void)setupBugly { #if COCOS2D_DEBUG == 1 [[CrashReporter sharedInstance] enableLog:YES];#endif exp_call_back_func=&exception_callback_ [[CrashReporter sharedInstance] installWithAppId:BUGLY_APP_ID]; }static int exception_callback_handler() { NSLog(@&Crash occur in the app&); string strAllLog = DebugUtil::GetAllLog(); StringUtil::ReplaceParam(strAllLog, &%0d&, &/n&); NSString *str = [NSString stringWithUTF8String:strAllLog.c_str()]; [[CrashReporter sharedInstance] setAttachLog:str]; return 1;} 我这里补加了,当触发上报时,把游戏内自己的LOG添加进去,调用了系统的setAttachLog方法 注意Other Link Flags不要乱加,默认加一个-ObjC就好,按官方的来加反而会遇到问题
剩下就是设置环境路径和测试了,按上面的官方文档就好了。 Header Search Paths ~/Documents/cocos2d_2/buglyLibrary Search Paths ~/Documents/cocos2d_2/bugly/ios
!!!特别要注意自己使用的是libc++还是libstdc++,不同的设置需要引入不同的framework 在使用CMD + R进行调试运行时,如果遇到错误它是直接就断点了,不然触发Bugly的上传,想测试。可以先点Stop,然后自己手动再启动一次游戏,通过Devices的日志来查看和测试上传
如果触发了Bugly的上报,你可以根据之前在AppController.mm中打印的Log来进行搜索 =======================================================
跨平台的编译,你会发现在iOS下还好,.mm就直接支持了混编。路径引入也比较简单改设置就完了,最麻烦是Android下必须要用到NDK,而这个就需要编译相关的一些知识,比如mk的编写等。像上面遇到的问题就是很多指令根本就不太了解,通过这次Bugly的接入,发现自己对GCC相关编译知识比较欠缺,所以需要好好补补,毕竟NDK还是非常重要的。 fuse 基本上就是通过NDK来实现各种绚丽的效果,把.ux文件直接全部转换为C++代码(这个太高难度动作了,要知道C++本身就是所有现代语言中最为复杂的,出一BUG项目想找人解决就很困难,一般人绝对hold不住),之前写过Java与C++的互调,接下来得好好准备GCC相关的学习了
今天收到一封邮件,就是自己之前处理emoji表情崩溃的问题,有人发邮件问我,一般来说我是不怎么回邮件的,但我看到它有一个附件,把log.txt发过来了,然后我花了几分钟浏览了一下错误日志,告诉他大概哪里出了问题。自己把遇到的问题分享出来,能帮忙到其它人,也算是一种幸运吧。 跨平台的开发水比较深,慎入啊,短期内我还看不到WEB成为主流或是跟Native分庭抗衡的可能,Native还将称霸很久,一想到这样难免会感到悲伤…
分享给朋友:
您可能感兴趣的文章:
随机阅读:

我要回帖

更多关于 cocos2dx ios sdk接入 的文章

 

随机推荐