之前做热更的时候发现的,直接跑官方的示例有问题
查了一下报错日志,是 JS 操作不当导致 C++ 报错,改之
仅提供一个修改参考方案,具体需要等官方查证修改
之前做热更的时候发现的,直接跑官方的示例有问题
查了一下报错日志,是 JS 操作不当导致 C++ 报错,改之
仅提供一个修改参考方案,具体需要等官方查证修改
// HotUpdate.js
// ..
updateCb: function (event) {
var needRestart = false;
var failed = false;
switch (event.getEventCode())
{
case jsb.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST:
this.panel.info.string = 'No local manifest file found, hot update skipped.';
failed = true;
break;
case jsb.EventAssetsManager.UPDATE_PROGRESSION:
this.panel.byteProgress.progress = event.getPercent();
this.panel.fileProgress.progress = event.getPercentByFile();
this.panel.fileLabel.string = event.getDownloadedFiles() + ' / ' + event.getTotalFiles();
this.panel.byteLabel.string = event.getDownloadedBytes() + ' / ' + event.getTotalBytes();
var msg = event.getMessage();
if (msg) {
this.panel.info.string = 'Updated file: ' + msg;
// cc.log(event.getPercent()/100 + '% : ' + msg);
}
break;
case jsb.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST:
case jsb.EventAssetsManager.ERROR_PARSE_MANIFEST:
this.panel.info.string = 'Fail to download manifest file, hot update skipped.';
failed = true;
break;
case jsb.EventAssetsManager.ALREADY_UP_TO_DATE:
this.panel.info.string = 'Already up to date with the latest remote version.';
failed = true;
break;
case jsb.EventAssetsManager.UPDATE_FINISHED:
this.panel.info.string = 'Update finished. ' + event.getMessage();
needRestart = true;
break;
case jsb.EventAssetsManager.UPDATE_FAILED:
this.panel.info.string = 'Update failed. ' + event.getMessage();
this.panel.retryBtn.active = true;
this._updating = false;
this._canRetry = true;
break;
case jsb.EventAssetsManager.ERROR_UPDATING:
this.panel.info.string = 'Asset update error: ' + event.getAssetId() + ', ' + event.getMessage();
break;
case jsb.EventAssetsManager.ERROR_DECOMPRESS:
this.panel.info.string = event.getMessage();
break;
default:
break;
}
if (failed) {
this._am.setEventCallback(null);
this._updateListener = null;
this._updating = false;
}
if (needRestart) {
this._am.setEventCallback(null);
this._updateListener = null;
// Prepend the manifest's search path
var searchPaths = jsb.fileUtils.getSearchPaths();
var newPaths = this._am.getLocalManifest().getSearchPaths();
console.log(JSON.stringify(newPaths));
// >>>>>从这里开始修改
// Array.prototype.unshift.apply(searchPaths, newPaths);
searchPaths.unshift(newPaths[0]);
// >>>>>修改结束
// This value will be retrieved and appended to the default search path during game startup,
// please refer to samples/js-tests/main.js for detailed usage.
// !!! Re-add the search paths in main.js is very important, otherwise, new scripts won't take effect.
cc.sys.localStorage.setItem('HotUpdateSearchPaths', JSON.stringify(searchPaths));
jsb.fileUtils.setSearchPaths(searchPaths);
cc.audioEngine.stopAll();
cc.game.restart();
}
},
this._am.setEventCallback(this.checkCb.bind(this)); 和 this._am.setEventCallback(this.updateCb.bind(this));这两句就会卡住,怎么解决啊
感觉是this._am.setEventCallback这个函数在1.10.2版本中不存在?请引擎大大回复一下
2.0.9会卡到updateCb上,不知道为什么
请问你的解决了吗,我也是卡在这个方法里了
这里只是设置回调函数,怎么会卡住呢?打印下checkCb和updateCb的调用参数,看看是不是跑了,最后的状态值是什么。
官方的demo就是卡住的,可以看下官方的2.x的demo。最后是通过注视掉checkCb中的 this._am.setEventCallback(null);解决的
麻烦帮忙给下官方2.x demo链接,谢谢
我的cocos creator是2.0.8,就是注释了上面说的这句话,就不会卡在更新的时候了,我用的demo就是官方的热更新demo,如果不注释这句话,会一直进不去updateCb中
E/jswrapper (268): ERROR: Uncaught TypeError: this._am.setEventCallback is not a function, location: src/project.js:0:0
STACK:
[0]checkUpdate@src/project.js:607
[1]emit@src/jsb_polyfill.js:4643
[2]emitEvents@src/jsb_polyfill.js:4631
[3]_onTouchEnded@src/jsb_polyfill.js:4261
[4]78.r.invoke@src/jsb_polyfill.js:9320
[5]anonymous@src/jsb_polyfill.js:9454
[6]79.l.dispatchEvent@src/jsb_polyfill.js:9469
[7]C@src/jsb_polyfill.js:1267
E/jswrapper (520): [ERROR] (e:\project\courseyear\build\jsb-default\frameworks\cocos2d-x\cocos\scripting\js-bindings\jswrapper\v8\object.cpp, 520): Invoking function (12241008) failed!
jsb: ERROR: File e:\project\courseyear\build\jsb-default\frameworks\cocos2d-x\cocos\scripting\js-bindings\manual\jsb_cocos2dx_manual.cpp: Line: 487, Function: invokeJSTouchOneByOneCallback
invokeJSTouchOneByOneCallback call function failed!
E/jswrapper (268): ERROR: Uncaught TypeError: this._am.setEventCallback is not a function, location: src/project.js:0:0
STACK:
[0]hotUpdate@src/project.js:615
[1]emit@src/jsb_polyfill.js:4643
[2]emitEvents@src/jsb_polyfill.js:4631
[3]_onTouchEnded@src/jsb_polyfill.js:4261
[4]78.r.invoke@src/jsb_polyfill.js:9320
[5]anonymous@src/jsb_polyfill.js:9454
[6]79.l.dispatchEvent@src/jsb_polyfill.js:9469
[7]C@src/jsb_polyfill.js:1267
E/jswrapper (520): [ERROR] (e:\project\courseyear\build\jsb-default\frameworks\cocos2d-x\cocos\scripting\js-bindings\jswrapper\v8\object.cpp, 520): Invoking function (121B60A0) failed!
jsb: ERROR: File e:\project\courseyear\build\jsb-default\frameworks\cocos2d-x\cocos\scripting\js-bindings\manual\jsb_cocos2dx_manual.cpp: Line: 487, Function: invokeJSTouchOneByOneCallback
invokeJSTouchOneByOneCallback call function failed!
D/jswrapper (560): XMLHttpRequest_finalize, 11D43318 …
E/jswrapper (268): ERROR: Uncaught TypeError: this._am.setEventCallback is not a function, location: src/project.js:0:0
STACK:
[0]checkUpdate@src/project.js:607
[1]emit@src/jsb_polyfill.js:4643
[2]emitEvents@src/jsb_polyfill.js:4631
[3]_onTouchEnded@src/jsb_polyfill.js:4261
[4]78.r.invoke@src/jsb_polyfill.js:9320
[5]anonymous@src/jsb_polyfill.js:9454
[6]79.l.dispatchEvent@src/jsb_polyfill.js:9469
[7]C@src/jsb_polyfill.js:1267
E/jswrapper (520): [ERROR] (e:\project\courseyear\build\jsb-default\frameworks\cocos2d-x\cocos\scripting\js-bindings\jswrapper\v8\object.cpp, 520): Invoking functionjsb: ERROR: File e:\project\courseyear\build\jsb-default\frameworks\cocos2d-x\cocos\scripting\js-bindings\manual\jsb_cocos2dx_manual.cpp: Line: 487, Function: invokeJSTouchOneByOneCallback
invokeJSTouchOneByOneCallback call function failed!
(121B6180) failed!
E/jswrapper (268): ERROR: Uncaught TypeError: this._am.setEventCallback is not a function, location: src/project.js:0:0
STACK:
[0]hotUpdate@src/project.js:615
[1]emit@src/jsb_polyfill.js:4643
[2]emitEvents@src/jsb_polyfill.js:4631
[3]_onTouchEnded@src/jsb_polyfill.js:4261
[4]78.r.invoke@src/jsb_polyfill.js:9320
[5]anonymous@src/jsb_polyfill.js:9454
[6]79.l.dispatchEvent@src/jsb_polyfill.js:9469
[7]C@src/jsb_polyfill.js:1267
E/jswrapper (520): [ERROR] (e:\project\courseyear\build\jsb-default\frameworks\cocos2d-x\cocos\scripting\js-bindings\jswrapper\v8\object.cpp, 520): Invoking function (121B60A0) failed!
jsb: ERROR: File e:\project\courseyear\build\jsb-default\frameworks\cocos2d-x\cocos\scripting\js-bindings\manual\jsb_cocos2dx_manual.cpp: Line: 487, Function: invokeJSTouchOneByOneCallback
invokeJSTouchOneByOneCallback call function failed!
1.9.3也报错,this._am.setEventCallback(this.checkCb.bind(this))这里错误,assetManger没有setEventCallback方法,请问官方人员这个setEventCallback到底哪个版本有??
请问下有官方人员出来回复下吗?
回复啥,上边代码都贴出来了
是要注释this._am.setEventCallback(this.checkCb.bind(this))这句吗??
看我的
官网的示例 下次给例子麻烦贴一下 cocoscreator版本号 sdk ndk版本号 最好自己在试试 官方例子现在也无法运行
无法运行,是报什么错误了吗?目前 creator 3.x 版本都支持,sdk 和 ndk 可以参考文档
https://docs.cocos.com/creator/3.1/manual/zh/editor/publish/setup-native-development.html#下载发布-android-平台所需的-sdk-和-ndk