初步排查是 Cocos Creator v2.3.3/2.3.4 的问题,使用 v2.3.2 不会发生异常崩溃。
请大大们检查下 v8 中 _obj 失败的问题。代码就参考:
https://github.com/sdkbox/sdkbox-sample-ccc200/blob/admob/build/jsb-link/frameworks/runtime-src/Classes/AppDelegate.cpp
Cocos Creator v2.3.3
SDKBOX INFO
_______ ______ _ _ ______ _____ _ _
|______ | \ |____/ |_____] | | \___/
______| |_____/ | \_ |_____] |_____| _/ \_
Copyright (c) 2016-2020 SDKBOX Inc. v1.3.1.0
installed packages:
v2.6.0.1 sdkboxads
v2.6.0.1 admob
v2.6.0.1 googleplayservices
在AppDelegate.cpp中导入头文件,加入下面代码
#ifdef SDKBOX_ENABLED
se->addRegisterCallback(register_all_PluginAdMobJS);
se->addRegisterCallback(register_all_PluginAdMobJS_helper);
#endif
当 se->start()被调用后,会执行上面的注册回调。
register_all_PluginAdMobJS会运行成功,然后register_all_PluginAdMobJS_helper会注册插件监听
bool register_all_PluginAdMobJS_helper(se::Object* obj)
{
auto pluginValue = sdkbox::getPluginValue(obj, "sdkbox.PluginAdMob");
auto plugin = pluginValue.toObject();
plugin->defineFunction("setListener", _SE(js_PluginAdMobJS_PluginAdMob_setListener));
se::ScriptEngine::getInstance()->clearException();
return true;
}
但是在上面的 auto pluginValue = sdkbox::getPluginValue(obj, "sdkbox.PluginAdMob"); 调用getPluginValue里,会将 sdkbox.PluginAdMob 分解成 sdkbox 和 PluginAdMob 并通过obj->getProperty方法在 obj 中查找是否包含了名字为他们的属性。
问题是:
因为 obj 对象不同,当去调用 getProperty 查找 PluginAdMob 的属性时,在
- 运行iPhone模拟器,会走
jswrapper/jsc/Object.mm的Object::getProperty方法,会成功。 - 运行真机,会走
jswrapper/v8/Object.cpp的Object::getProperty方法,会失败。
失败在,当断言getProperty返回值是一个对象的时候,真机(v8)却返回了 Undefined,导致游戏崩溃。
v8 的 Object::getProperty 代码如下:
bool Object::getProperty(const char *name, Value *data)
{
assert(data != nullptr);
data->setUndefined();
v8::HandleScope handle_scope(__isolate);
if (_obj.persistent().IsEmpty())
{
return false;
}
// ...
}
在判断条件 _obj.persistent().IsEmpty() 时成立,返回了 false。
请问,如何配置才不会出上面的问题?