環(huán)境
unity 2022.3.62f1
Puerts_V8_2.2.2_16kb
RuntimeError: null function or function signature mismatch
打包webgl后,運行報錯:
Invoking error handler due to
RuntimeError: null function or function signature mismatch
at pesapi_on_class_not_found (export_browser_1ae4ad.wasm.gz:0x85483c)
at VideoClipMedia::JobEntryPointInternal(browser/void (*)(void*), void*) (http://builder.fygame.com:8484/res/sjqy_develop/browser/Build/export_browser_1ae4ad.wasm.gz)
at invoke_vi (export_browser_f0532d.framework.js.gz:10:439456)
at puerts::InitialPapiEnvRef(browser/pesapi_ffi*, pesapi_env_ref__*, Il2CppObject*, Il2CppReflectionMethod*, Il2CppReflectionMethod*) (http://builder.fygame.com:8484/res/sjqy_develop/browser/Build/export_browser_1ae4ad.wasm.gz)
at JsEnv__ctor_m721E14524F762EED47C03E0096E54C27589FA674 (export_browser_1ae4ad.wasm.gz:0x8ef111)
at MainEnv_Get_mAC2BF76F4EABB1D291F740413E6F3E92ABC9A8AA (export_browser_1ae4ad.wasm.gz:0x913f4e)
at JVM_Init_mF36761B3907926989F056C942227057D26B0F877 (export_browser_1ae4ad.wasm.gz:0x91ce44)
at root_webgl_ExecuteJS_m2B80BE468922838185546A0E5A5916010F65178A (export_browser_1ae4ad.wasm.gz:0x922d99)
at root_webgl_OnCheckEnd_mE2B188B0793C53430E29B7C0748E28489817DC26 (export_browser_1ae4ad.wasm.gz:0x922d1b)
at AssetRequest_EndLoad_mCD188F843011FBC820B0B74E492F4C17FABA0893 (export_browser_1ae4ad.wasm.gz:0x93b65a)
at ResLoader_Update_m70FFEF1A8E0CDC5AC632FC54132FCBA0C0DAC786 (export_browser_1ae4ad.wasm.gz:0x943106)
at RuntimeInvoker_TrueVoid_t4861ACF8F4594C3437BB48B6E56783494B843915(browser/void (*)(), MethodInfo const*, void*, void**, void*) (http://builder.fygame.com:8484/res/sjqy_develop/browser/Build/export_browser_1ae4ad.wasm.gz)
at il2cpp::vm::Runtime::InvokeWithThrow(browser/MethodInfo const*, void*, void**) (http://builder.fygame.com:8484/res/sjqy_develop/browser/Build/export_browser_1ae4ad.wasm.gz)
at dynCall_iiii (export_browser_1ae4ad.wasm.gz:0x19d32cf)
at invoke_iiii (export_browser_f0532d.framework.js.gz:10:439605)
at il2cpp::vm::Runtime::Invoke(browser/MethodInfo const*, void*, void**, Il2CppException**) (http://builder.fygame.com:8484/res/sjqy_develop/browser/Build/export_browser_1ae4ad.wasm.gz)
at il2cpp_runtime_invoke (export_browser_1ae4ad.wasm.gz:0xb2963)
at scripting_method_invoke(browser/ScriptingMethodPtr, ScriptingObjectPtr, ScriptingArguments&, ScriptingExceptionPtr*, bool) (http://builder.fygame.com:8484/res/sjqy_develop/browser/Build/export_browser_1ae4ad.wasm.gz)
at ScriptingInvocation::Invoke(browser/ScriptingExceptionPtr*, bool) (http://builder.fygame.com:8484/res/sjqy_develop/browser/Build/export_browser_1ae4ad.wasm.gz)
at MonoBehaviour::CallUpdateMethod(browser/int) (http://builder.fygame.com:8484/res/sjqy_develop/browser/Build/export_browser_1ae4ad.wasm.gz)
at MonoBehaviour::Update(browser/) (http://builder.fygame.com:8484/res/sjqy_develop/browser/Build/export_browser_1ae4ad.wasm.gz)
at BehaviourManager::Update(browser/) (http://builder.fygame.com:8484/res/sjqy_develop/browser/Build/export_browser_1ae4ad.wasm.gz)
at InitPlayerLoopCallbacks(browser/)::UpdateScriptRunBehaviourUpdateRegistrator::Forward() (http://builder.fygame.com:8484/res/sjqy_develop/browser/Build/export_browser_1ae4ad.wasm.gz)
at ExecutePlayerLoop(browser/NativePlayerLoopSystem*) (http://builder.fygame.com:8484/res/sjqy_develop/browser/Build/export_browser_1ae4ad.wasm.gz)
at ExecutePlayerLoop(browser/NativePlayerLoopSystem*) (http://builder.fygame.com:8484/res/sjqy_develop/browser/Build/export_browser_1ae4ad.wasm.gz)
at MainLoop(browser/) (http://builder.fygame.com:8484/res/sjqy_develop/browser/Build/export_browser_1ae4ad.wasm.gz)
at dynCall_v (export_browser_1ae4ad.wasm.gz:0x19d3301)
at browserIterationFunc (export_browser_f0532d.framework.js.gz:10:247653)
at callUserCallback (export_browser_f0532d.framework.js.gz:10:201225)
at Object.runIter (export_browser_f0532d.framework.js.gz:10:202465)
at Browser_mainLoop_runner (export_browser_f0532d.framework.js.gz:10:200761)
按理說,這個pesapi_on_class_not_found定義在Assets\webgl\upm\Runtime\Plugins\WebGL\puerts.jslib中:

image.png
理應注冊到
exportDLL中,但實際查看打包后的framework.js:
image.png
只有部分方法存在,搜索
please find some way to load puerts-runtime.js看到只匹配了40個
image.png
而
puerts.jslib中明顯不止這么多。修改打包后的
puerts-runtime.js,找到這部分代碼:
n.global.wxRequire = n.global.require, n.global.PuertsWebGL = {
inited: !1,
debug: !1,
Init(e) {
}
}
把其中的debug: !1改為debug: true,得到日志
WebGL DLL:SetLogCallback
WebGL DLL:GetRegsterApi
WebGL DLL:CreateJSEngine
WebGL DLL:GetLibBackend
WebGL DLL:GetWebGLFFIApi
WebGL DLL:GetWebGLPapiEnvRef
WebGL DLL:pesapi_open_scope_placement_js
WebGL DLL:pesapi_set_env_private_js
WebGL DLL:pesapi_create_function_js
WebGL DLL:pesapi_create_function_js
WebGL DLL:pesapi_global_js
WebGL DLL:pesapi_set_property_js
WebGL DLL:pesapi_set_property_js
這些函數(shù)都call成功了。現(xiàn)在問題就是pesapi_on_class_not_found這個函數(shù)不知道為何沒有打包到framework.js中。這想來有種被剔除了的感覺。
于是統(tǒng)計了一下,merge成功的函數(shù)一共39個:
GetLibBackend
CreateJSEngine
DestroyJSEngine
LowMemoryNotification
IdleNotificationDeadline
RequestMinorGarbageCollectionForTesting
RequestFullGarbageCollectionForTesting
CreateInspector
InspectorTick
LogicTick
SetLogCallback
GetWebGLFFIApi
GetWebGLPapiEnvRef
GetQjsFFIApi
GetQjsPapiEnvRef
GetRegsterApi
pesapi_create_array_js
pesapi_create_object_js
pesapi_create_function_js
pesapi_create_class_js
pesapi_native_object_to_value_js
pesapi_throw_by_string_js
pesapi_open_scope_placement_js
pesapi_has_caught_js
pesapi_get_exception_as_string_js
pesapi_close_scope_placement_js
pesapi_create_value_ref_js
pesapi_release_value_ref_js
pesapi_get_value_from_ref_js
pesapi_get_property_js
pesapi_set_property_js
pesapi_get_private_js
pesapi_set_private_js
pesapi_get_property_uint32_js
pesapi_set_property_uint32_js
pesapi_call_function_js
pesapi_eval_js
pesapi_global_js
pesapi_set_env_private_js
沒有merge的則有77個:
GetLibVersion
GetApiLevel
CreateJSEngineWithExternalEnv
SetGlobalFunction
GetLastExceptionInfo
SetGeneralDestructor
Eval
ClearModuleCache
GetModuleExecutor
GetJSObjectValueGetter
GetJSStackTrace
_RegisterClass
RegisterStruct
RegisterFunction
RegisterProperty
ReturnClass
ReturnObject
ReturnNumber
ReturnString
ReturnBigInt
ReturnBoolean
ReturnDate
ReturnNull
ReturnFunction
ReturnJSObject
ReturnArrayBuffer
ReturnCSharpFunctionCallback
ReturnCSharpFunctionCallback2
GetTypeIdFromValue
SetNumberToOutValue
SetDateToOutValue
SetStringToOutValue
SetBooleanToOutValue
SetBigIntToOutValue
SetObjectToOutValue
SetNullToOutValue
SetArrayBufferToOutValue
ThrowException
PushNullForJSFunction
PushDateForJSFunction
PushBooleanForJSFunction
PushBigIntForJSFunction
PushStringForJSFunction
__PushStringForJSFunction
PushNumberForJSFunction
PushObjectForJSFunction
PushJSFunctionForJSFunction
PushJSObjectForJSFunction
PushArrayBufferForJSFunction
SetPushJSFunctionArgumentsCallback
InvokeJSFunction
GetFunctionLastExceptionInfo
ReleaseJSFunction
ReleaseJSObject
GetResultType
GetNumberFromResult
GetDateFromResult
GetStringFromResult
GetBooleanFromResult
ResultIsBigInt
GetBigIntFromResult
GetObjectFromResult
GetTypeIdFromResult
GetFunctionFromResult
GetJSObjectFromResult
GetArrayBufferFromResult
ResetResult
DestroyInspector
TerminateExecution
pesapi_alloc_property_descriptors
pesapi_define_class
pesapi_get_class_data
pesapi_on_class_not_found
pesapi_set_method_info
pesapi_set_property_info
pesapi_trace_native_object_lifecycle
pesapi_get_array_length_js
果不其然,以GetLibVersion為例,確實和code striping有關系:

image.png
這個接口并沒有被顯式引用。
而看看
GetLibBackend則是被引用了:
image.png
于是我試試看把stripe code關掉,重新打包再試,還是一樣的報錯。由此可見以上分析并不正確。
回頭再看看報錯堆棧,報錯是報在wasm.gz里,這么應該是C#或C++里面報錯?;仡^看看
puerts::InitialPapiEnvRef所在的project\Assets\Gen\Plugins\puerts_il2cpp\Puerts_il2cpp.cpp,這個文件是wrap生成的。仔細查看生成wrap代碼的源碼,發(fā)現(xiàn)webgl模式下有所區(qū)別:
image.png
所以真正的原因是我wrap的代碼是在非webgl模式下wrap的,生成的puerts native plugins不適用于webgl。unity切到webgl后重新wrap解決此問題。
又一次 null function or function signature mismatch
過幾天,在一次構建版本后,又一次遇到類似的報錯:
Uncaught RuntimeError: null function or function signature mismatch
at JsEnv__ctor_m721E14524F762EED47C03E0096E54C27589FA674 (export_browser_c26325.wasm.gz:0x6bfd9c)
at MainEnv_Get_mAC2BF76F4EABB1D291F740413E6F3E92ABC9A8AA (export_browser_c26325.wasm.gz:0x6ce683)
at JVM_Init_mF36761B3907926989F056C942227057D26B0F877 (export_browser_c26325.wasm.gz:0x76f2af)
at root_webgl_ExecuteJS_m2B80BE468922838185546A0E5A5916010F65178A (export_browser_c26325.wasm.gz:0x774c89)
at root_webgl_OnCheckEnd_mE2B188B0793C53430E29B7C0748E28489817DC26 (export_browser_c26325.wasm.gz:0x774c0b)
at AssetRequest_EndLoad_mCD188F843011FBC820B0B74E492F4C17FABA0893 (export_browser_c26325.wasm.gz:0x790db8)
at ResLoader_Update_m70FFEF1A8E0CDC5AC632FC54132FCBA0C0DAC786 (export_browser_c26325.wasm.gz:0x79822c)
at RuntimeInvoker_TrueVoid_t4861ACF8F4594C3437BB48B6E56783494B843915(browser/void (*)(), MethodInfo const*, void*, void**, void*) (http://builder.fygame.com:8484/res/sjqy_develop/browser/Build/export_browser_c26325.wasm.gz)
at il2cpp::vm::Runtime::InvokeWithThrow(browser/MethodInfo const*, void*, void**) (http://builder.fygame.com:8484/res/sjqy_develop/browser/Build/export_browser_c26325.wasm.gz)
at dynCall_iiii (export_browser_c26325.wasm.gz:0x199c1fa)
at invoke_iiii (export_browser_2e2702.framework.js.gz:10:534337)
at il2cpp::vm::Runtime::Invoke(browser/MethodInfo const*, void*, void**, Il2CppException**) (http://builder.fygame.com:8484/res/sjqy_develop/browser/Build/export_browser_c26325.wasm.gz)
at il2cpp_runtime_invoke (export_browser_c26325.wasm.gz:0xca8ca)
at scripting_method_invoke(browser/ScriptingMethodPtr, ScriptingObjectPtr, ScriptingArguments&, ScriptingExceptionPtr*, bool) (http://builder.fygame.com:8484/res/sjqy_develop/browser/Build/export_browser_c26325.wasm.gz)
at ScriptingInvocation::Invoke(browser/ScriptingExceptionPtr*, bool) (http://builder.fygame.com:8484/res/sjqy_develop/browser/Build/export_browser_c26325.wasm.gz)
at MonoBehaviour::CallUpdateMethod(browser/int) (http://builder.fygame.com:8484/res/sjqy_develop/browser/Build/export_browser_c26325.wasm.gz)
at MonoBehaviour::Update(browser/) (http://builder.fygame.com:8484/res/sjqy_develop/browser/Build/export_browser_c26325.wasm.gz)
at BehaviourManager::Update(browser/) (http://builder.fygame.com:8484/res/sjqy_develop/browser/Build/export_browser_c26325.wasm.gz)
at InitPlayerLoopCallbacks(browser/)::UpdateScriptRunBehaviourUpdateRegistrator::Forward() (http://builder.fygame.com:8484/res/sjqy_develop/browser/Build/export_browser_c26325.wasm.gz)
at ExecutePlayerLoop(browser/NativePlayerLoopSystem*) (http://builder.fygame.com:8484/res/sjqy_develop/browser/Build/export_browser_c26325.wasm.gz)
at ExecutePlayerLoop(browser/NativePlayerLoopSystem*) (http://builder.fygame.com:8484/res/sjqy_develop/browser/Build/export_browser_c26325.wasm.gz)
at MainLoop(browser/) (http://builder.fygame.com:8484/res/sjqy_develop/browser/Build/export_browser_c26325.wasm.gz)
at dynCall_v (export_browser_c26325.wasm.gz:0x199c22c)
at browserIterationFunc (export_browser_2e2702.framework.js.gz:10:378435)
at callUserCallback (export_browser_2e2702.framework.js.gz:10:270603)
at Object.runIter (export_browser_2e2702.framework.js.gz:10:271843)
at Browser_mainLoop_runner (export_browser_2e2702.framework.js.gz:10:270139)
這一次報錯和上次類似又有所不同。一開始還以為又是wrap的問題,可在webgl模式下重新wrap后,問題依舊。將Assets\Gen\Plugins\puerts_il2cpp的內容還原到上一次沒有報錯的狀態(tài),發(fā)現(xiàn)確實有所變化。查看生成wrap代碼的源碼,發(fā)現(xiàn)有一段讀取小游戲配置的代碼:

image.png
這里當小游戲里的設置和Player Setting的設置沖突時,優(yōu)先使用小游戲的設置。于是想起來了,前兩天安裝了小游戲插件!小游戲插件里IL2CppOptimizeSize默認是OptimizeSize,而Player Setting里我設置的OptimizeSpeed。把兩者統(tǒng)一,這個報錯就解決了。