开发环境:
cocoscreator 2.0.10
Android studio 3.3.2
grandle 版本 gradle-4.10.3-all
ndk版本 r16b
sdk版本 28
本来没打算记录的,但是转念一想,要是能够帮助到其他人呢,所以还是记录一篇。
若有写的不对的,欢迎帖子下面留言指出。
**
第一坑:C++回调js崩溃
**
_ [FATAL ERROR] location: v8::HandleScope::CreateHandle(), message: Cannot create a handle without a HandleScope_
造成这个错误的直接原因是,在C++调用js之前,没有声明 se::AutoHandleScope hs;
解决方法:在调用之前加上这个声明就OK了
第二坑:C++利用 evalString()函数回调js,传递字符串
C++回调代码
错误日志:
E/jswrapper: ERROR: Uncaught SyntaxError: Invalid or unexpected token, location: (no filename):0:0
E/jswrapper: ScriptEngine::evalString script (no filename), failed!
关于这个坑,只能说是自己大意了,或者是想偷懒造成的坑,因为刚开始测试的时候,回传参数就写了个数字,然后一切都没问题,于是乎就以为一切都OK了。
然而当你的参数涉及到字符串的时候,坑就出现了,你打印charStr这个字符串,发现没问题,然后之前调用cc.quicksdk.notifyLoginResult(0) 也没问题,
为什么参数传多了就报 no filename 了呢。
解决方案:
解决方案也是比较简单,就是将字符串进行转译,至于为什么,我觉得明白的早已明白,不明白的,思考一下也能明白。说到底,这个坑是自己偷懒造成的,因为本可以把回调函数也注册进C++,这样C++这边就不需要使用evalString来回调js了。
第三坑:js调用的C++ bool函数,没有写return
C++代码如下
又给自己挖了一个坑,先看错误日志吧
错误日志:
2020-03-13 11:04:52.935 28032-28120/com.jsgame.helloworld D/cocos2d-x: js_engine_SdkBridge_updateRoleInfoWith
2020-03-13 11:04:52.936 28032-28120/com.jsgame.helloworld D/cocos2d-x: QuickSDK::updateRoleInfoWith…
2020-03-13 11:04:52.936 28032-28120/com.jsgame.helloworld D/QKManager: setGameRoleInfo
2020-03-13 11:04:52.937 28032-28120/com.jsgame.helloworld D/BaseLib Cu: sci
2020-03-13 11:04:52.937 28032-28120/com.jsgame.helloworld D/BaseLib Cu: ac2i
2020-03-13 11:04:52.938 28032-28120/com.jsgame.helloworld D/quicksdk apiadapter.undefined: setGameRoleInfo
2020-03-13 11:04:52.938 28032-28155/com.jsgame.helloworld D/BaseLib Cu: iue
2020-03-13 11:04:52.938 28032-28155/com.jsgame.helloworld D/BaseLib Cu: gcl
2020-03-13 11:04:52.938 28032-28155/com.jsgame.helloworld D/BaseLib Cu: gcc
--------- beginning of crash
2020-03-13 11:04:52.939 28032-28120/com.jsgame.helloworld A/libc: Fatal signal 4 (SIGILL), code 1, fault addr 0xcb70b9ec in tid 28120 (GLThread 4283)
这个坑属于粗心大意,在C++跟js之间来回切换,造成了疏忽,好在比较容易解决,不过崩溃报的错算是怎么回事么,害的我一直以为是线程问题,找了好一会问题。
解决方案:
既然没返回值,那就 void 就完事了。
第四坑:Android debug包正常,Release启动崩溃。
错误日志:
java.lang.RuntimeException: Unable to create application com.ct108.mnby.MyApplication: java.lang.NullPointerException: Attempt to invoke interface method ‘com.b.a.a com.b.a.b.a()’ on a null object reference
这个也百度了不少帖子,各种答案各种不同的修复,可就是没有对口的方案,后来问一大佬同事,大佬一语击中了我,
混淆,我勒个擦擦啊,在大佬的提示,我在android的app目录下,找到了
这个文件,打开文件,照葫芦画瓢,把两个第三方的jar包丢进去,OK,一切正常了,世界终于清净了。
顺带把自己写的工具类也丢进去。
第五坑:Android动态权限获取
关于动态权限获取,其实网络上也有比较多的流行方案,https://www.jianshu.com/p/6e306729bb0d 这只是一个参考,里面写了当下比较流行的两种
Easy Permissions 跟 Permissions Dispatcher
具体怎么选择,每个人都有自己不同的观点,我选择了 Easy Permissions,集成起来也比较得方便,官方得github也写得比较详细
github传送门:https://github.com/googlesamples/easypermissions
我照着官方的,集成了这个版本
这里需要注意的一点就是,看一下官方对sdk的要求
重点,你的sdk版本必须是28,
OK,注意到这个之后,其他的就没有问题了。
第六坑:Android studio 打签名包报错
Android studio 签名 报错:Could not download groovy-all.jar (org.codehaus.groovy:groovy-all:2.4.12)
好吧,继续万能的百度吧,
方法一:在Android的APP目录下,找到build.gradle文件,在android{}的里面加入下面的代码
神奇也是神奇,签名包是打出来了,没有卡在签名了,然而启动就崩溃了,maybe问题在其他地方。
方法二:替换下载站,把Android工程的build.gradle文件里面的下载站更换,
就这两个地方,然后把方法一的方式注释,OK,签名包也是顺利的出来了,再启动一下,好了,游戏正常运行。
所以呢,还是因为墙内用户的锅。
第七坑:Android端APP,websocket的wss连接失败
报错内容,跟论坛里的一位帖子类似 https://forum.cocos.org/t/websocket-ssl/60024,而且这帖子的主人也分析的很细致了,我遇到的问题基本跟他一致,只是解决方式略微的不同,所以记录一下,以便其他遇到问题的开发者参考。
错误日志的关键语句:
CA Root file isn’t set. SSL connection will not peer server certificate
Creating Vhost ‘default’ port -1, 1 protocols, IPv6 on
server’s cert didn’t look good, X509_V_ERR = 20: error:00000014:lib(0):func(0):reason(20)
WebSocket (0xc616f900) onConnectionError, state: 0 …
WebSocket (0xc616f900) onConnectionClosed, state: 2 …
onConnectionClosed, WebSocket (0xc616f900) is closing by server.
WebSocket (0xc616f900) onConnectionClosed DONE!
解决方式:上代码吧,看的直接点
md5这个要看你构建的时候是不是勾选了MD5 cache的选项,所以这样写必然是OK的。
至于第三个参数的提示飘红,你可以直接忽略,或者直接看一下cocos的源码
在 jsb_websocket.cpp的WebSocket_constructor这个函数中,你会看到这么一个调用
so,你就放心大胆的用吧,管它飘红不飘红。
好像差不多就踩了这些坑吧, 后续要是有想起来其他的,再补上。