[3.5.x] Android App C++ 部分报错

  • Creator 版本:3.5.0

  • 目标平台:Android

  • 重现方式:

  1. 将整个 assets 下的内容移动到 remote-asset 下面
  2. /data/user/0/com.win.cvtxwqy.miisf/files/remote-asset/ 增加到 script search path
  3. 启动程序报错

报错信息如下:

2022-09-30 15:54:48.810 8163-8199/com.win.cvtxwqy.miisf I/Cocos: 15:54:48 [INFO]: searchPath: /data/user/0/com.win.cvtxwqy.miisf/files/remote-asset/
2022-09-30 15:54:48.810 8163-8199/com.win.cvtxwqy.miisf I/Cocos: 15:54:48 [INFO]: searchPath: @assets/data/
2022-09-30 15:54:48.810 8163-8199/com.win.cvtxwqy.miisf I/Cocos: 15:54:48 [INFO]: searchPath: @assets/Resources/
2022-09-30 15:54:48.810 8163-8199/com.win.cvtxwqy.miisf I/Cocos: 15:54:48 [INFO]: searchPath: @assets/
2022-09-30 15:54:48.813 8163-8199/com.win.cvtxwqy.miisf I/Cocos: 15:54:48 [INFO]: run here 1
2022-09-30 15:54:48.813 8163-8199/com.win.cvtxwqy.miisf I/Cocos: 15:54:48 [INFO]: run here 2
2022-09-30 15:54:48.820 8163-8199/com.win.cvtxwqy.miisf E/jswrapper: ERROR: Uncaught SyntaxError: Unexpected end of input, location: jsb-adapter/jsb-builtin.js:0:0
2022-09-30 15:54:48.820 8163-8199/com.win.cvtxwqy.miisf E/Cocos: 15:54:48 [ERROR]: [ERROR] file D:/ProgramFiles/CocosDashboard/resources/.editors/Creator/3.5.0/resources/resources/3d/engine/native/cocos/application/CocosApplication.cpp: line 140 
2022-09-30 15:54:48.820 8163-8199/com.win.cvtxwqy.miisf E/Cocos: 15:54:48 [ERROR]: 
    Uncaught Exception:
     - location :  jsb-adapter/jsb-builtin.js:0:0
     - msg : Uncaught SyntaxError: Unexpected end of input
     - detail : 
          
2022-09-30 15:54:48.820 8163-8199/com.win.cvtxwqy.miisf I/Cocos: 15:54:48 [INFO]: run here 3
2022-09-30 15:54:48.820 8163-8199/com.win.cvtxwqy.miisf I/Cocos: 15:54:48 [INFO]: script [jsb-adapter/jsb-builtin.js] is empty? true

读取 jsb-adapter/jsb-builtin.js 直接报错了

修改的代码如下

    v8::ScriptOrigin           origin(_isolate, originStr.ToLocalChecked());
    v8::MaybeLocal<v8::Script> maybeScript = v8::Script::Compile(_context.Get(_isolate), source.ToLocalChecked(), &origin);
    bool success = false;

    CC_LOG_INFO("script [%s] is empty? %s", fileName, maybeScript.IsEmpty() ? "true" : "false");
    if (!maybeScript.IsEmpty()) {
        v8::TryCatch block(_isolate);

        v8::Local<v8::Script>     v8Script    = maybeScript.ToLocalChecked();
        v8::MaybeLocal<v8::Value> maybeResult = v8Script->Run(_context.Get(_isolate));

        CC_LOG_INFO("script [%s] run result is empty? %s", fileName, maybeResult.IsEmpty() ? "true" : "false");
        if (!maybeResult.IsEmpty()) {
            v8::Local<v8::Value> result = maybeResult.ToLocalChecked();

            if (!result->IsUndefined() && ret != nullptr) {
                internal::jsToSeValue(_isolate, result, ret);
            }

            success = true;
        }

        if (block.HasCaught()) {
            v8::Local<v8::Message> message = block.Message();
            SE_LOGE("ScriptEngine::evalString catch exception:\n");
            onMessageCallback(message, v8::Undefined(_isolate));
        }
    }

    if (!success) {
        SE_LOGE("ScriptEngine::evalString script %s, failed!\n", fileName);
    }

报错点是这一句

v8::MaybeLocal<v8::Script> maybeScript = v8::Script::Compile(_context.Get(_isolate), source.ToLocalChecked(), &origin);

请问有什么办法解决下?

@panda
@jare

我的本意是第一次加载 JS 的时候,不从 assets 中加载。而是从类似热更新目录(remote-assets)下去加载。

但是这样貌似行不通,即使我在引擎启动的时候,加入了脚本搜索路径