[UE] Bug: quickjs模式关闭时崩溃
9000miles opened this issue · comments
前置阅读 | Pre-reading
Puer的版本 | Puer Version
1.0.5, 1.0.6, 1.0.7
UE的版本 | UE Version
4.27
发生在哪个平台 | Platform
Editor(win)
错误信息 | Error Message
1.0.5, 1.0.6, 1.0.7这几个版本都测试过,都有问题
问题重现 | Bug reproduce
quickjs模式如果在JsEnv->Start传入UObject对象到js,那么关闭时JsEnv析构时会报错,但是在v8模式不会报错
报错与Start函数传递UObject对象参数有关,不传递则不会报错
TArray<TPair<FString, UObject*>> Arguments;
UEngine* Engine = GEngine;
UWorld* World = GEngine->GetCurrentPlayWorld();
World = Engine->GetWorldContextFromPIEInstance(0)->World();
Arguments.Add(TPair<FString, UObject*>(TEXT("GameInstance"), World->GetGameInstance()));
JsEnv->Start(Settings.StartScript, Arguments);
新版本的quickjs库会崩,我往回试了下,这个版本没崩,你可以先用这个试试:https://github.com/puerts/backend-quickjs/releases/tag/QJS_240424
甚至早一天编译的都没问题,你帮忙试试:https://github.com/puerts/backend-quickjs/releases/tag/QJS_240603
下载覆盖Plugins\Puerts\ThirdParty\quickjs对应文件
甚至早一天编译的都没问题,你帮忙试试:https://github.com/puerts/backend-quickjs/releases/tag/QJS_240603 下载覆盖Plugins\Puerts\ThirdParty\quickjs对应文件
你先确认下这个版本有没问题
我也碰到,然后环境清理下没崩了,不过用quickjs的新版本会有其它问题,你用这个回退了quikcjs的版本试试,我这里没问题:
https://github.com/puerts/backend-quickjs/releases/tag/QJS_240720_revert_quickjs_version
清理方法:Plugins\Puerts\Binaries\Win64下东西全删了,然后整个工程clean后重现编译。
我也碰到,然后环境清理下没崩了,不过用quickjs的新版本会有其它问题,你用这个回退了quikcjs的版本试试,我这里没问题: https://github.com/puerts/backend-quickjs/releases/tag/QJS_240720_revert_quickjs_version
清理方法:Plugins\Puerts\Binaries\Win64下东西全删了,然后整个工程clean后重现编译。
清理、替换,重新编译之后,
1.0.5还是同样的报错信息
但是1.0.6和1.0.7不会
我先替换这个版本,切到1.0.7版本使用,1.0.5版应该不会使用,只是我提一下我这边测试时它还是存在问题
你们为啥要用quickjs呢?一般ue下很少人用它。
如果因为html5,可以仅html5用quickjs。
你们为啥要用quickjs呢?一般ue下很少人用它。
如果因为html5,可以仅html5用quickjs。
对的,就是在html5中使用。明白了编辑器下就不用。感谢感谢
定位了下新版本quickjs为啥会执行失败。
首先表现的现象是:log.js执行时,报global.puerts是undefined。
定位到是对全局对象设置属性不成功所致。
然后更改代码为JS_SetPropertyStr能够设置成功,JS_SetProperty设置不成功,看quickjs源码怎么都看不出来(unity下quickjs版本用最新的也工作正常)。
JS_SetProperty比较特殊,它是直接在头文件调用JS_SetPropertyInternal实现的,而新版本JS_SetPropertyInternal刚好参数修改了。
于是怀疑是编译缓存的问题,但在VS那Clean了,Plugins\Puerts\Binaries\Win64也删除了都没解决问题。
最后把工程的Intermediate、Binaries,Puerts下的Intermediate、Binaries都删除,重新生成工程后问题解决。