V8 Android,创建上下文导致断言。。。检查(对象->;IsJSFunction())失败 我已经成功地将Android的V8 JavaScript引擎编译成静态LIB(LIV8ARMAR.A),并且我可以静态地将它链接到我的Android本地C++应用程序(使用NDK-R5B)。p>

V8 Android,创建上下文导致断言。。。检查(对象->;IsJSFunction())失败 我已经成功地将Android的V8 JavaScript引擎编译成静态LIB(LIV8ARMAR.A),并且我可以静态地将它链接到我的Android本地C++应用程序(使用NDK-R5B)。p>,android,v8,Android,V8,在Android上,当创建V8上下文时,我得到这个运行时断言 //初始化V8上下文 本地globals=ObjectTemplate::New() context=context::New(空,全局) v8/src/objects inl.h中的致命错误,第1581行 检查(对象->IsJSFunction())失败 当我将V8嵌入我的应用程序的MacOSX版本时,一切都运行良好,我可以毫无问题地执行javascript。我花了很多时间编写代码,还研究了为Android构建V8的gcc命令行参数

在Android上,当创建V8上下文时,我得到这个运行时断言

//初始化V8上下文

本地globals=ObjectTemplate::New()

context=context::New(空,全局)

v8/src/objects inl.h中的致命错误,第1581行

检查(对象->IsJSFunction())失败

当我将V8嵌入我的应用程序的MacOSX版本时,一切都运行良好,我可以毫无问题地执行javascript。我花了很多时间编写代码,还研究了为Android构建V8的gcc命令行参数。我被卡住了,很快就要破解V8代码了

有人知道V8运行时初始化需要什么才能通过Context::New()断言吗

谢谢


更新:
我试图通过修改CAST_ACCESSOR宏来解决此问题

extern int __cast_accessor_count /* = 0 */;

// in the cpp file where Context::New() is called 
//namespace v8 { namespace internal {
//int __cast_accessor_count = 0;
//}; };

#define CAST_ACCESSOR(type)                     \
  type* type::cast(Object* object) {            \
    __cast_accessor_count++;                    \
    if( !object->Is##type() ) { OS::Print( "CAST_ACCESSOR %d %s\n",     __cast_accessor_count, #type );  object->ShortPrint(); } \
    ASSERT(object->Is##type());                 \
    return reinterpret_cast<type*>(object);     \
  }  
在Android上,命中断言之前的输出是

__cast_accessor_count=0  
CAST_ACCESSOR 101980 JSFunction  
0x486c4135 <undefined>  
arm-eabi-c++过滤器

v8::internal::JSFunction::cast(v8::internal::Object*)
v8::internal::Genesis::InstallJSBuiltins(v8::internal::Handle<v8::internal::JSBuiltinsObject>)
v8::internal::Genesis::InstallNatives()
v8::internal::Genesis::Genesis(v8::internal::Handle<v8::internal::Object>,     v8::Handle<v8::ObjectTemplate>, v8::ExtensionConfiguration*)
v8::internal::Bootstrapper::CreateEnvironment(v8::internal::Handle<v8::internal::Object>,     v8::Handle<v8::ObjectTemplate>, v8::ExtensionConfiguration*)
v8::Context::New(v8::ExtensionConfiguration*, v8::Handle<v8::ObjectTemplate>,     v8::Handle<v8::Value>)
JavascriptEngine::Init()  
v8::internal::JSFunction::cast(v8::internal::Object*)
v8::internal::Genesis::InstallJSBuiltins(v8::internal::Handle)
v8::internal::Genesis::InstallNatives()
v8::internal::Genesis::Genesis(v8::internal::Handle,v8::Handle,v8::ExtensionConfiguration*)
v8::internal::Bootstrapper::CreateEnvironment(v8::internal::Handle,v8::Handle,v8::ExtensionConfiguration*)
v8::Context::New(v8::ExtensionConfiguration*,v8::Handle,v8::Handle)
JavascriptEngine::Init()

libraries.cc就是答案


在android上,我使用的是为macosx构建生成的libraries.cc文件。通过使用js2c.py工具为android生成一个新的libraries.cc文件,我修复了android上的问题

您使用的版本是什么?我检查了所有主要分支,但在其中任何一个分支中都没有找到该行的检查。我使用的是来自Android源代码的V8版本。好的,我现在看到了。不幸的是,JSFunction::cast()被大量使用。你能在调试器下运行你的应用程序来获得回溯吗?不,不幸的是,你不能确定在设备上它在第一次调用JSFunction::cast()时失败,所以这个堆栈跟踪没有解释任何事情。请在设备()上运行调试器,以捕获设备失败的时刻。(下次请不要将堆栈跟踪直接发布到注释中,而是使用gist.github.com之类的东西)。在Heap::CreateInitialObjects中只创建一次奇怪的对象。您真的需要弄清楚哪个JSFunction::cast()失败了——确切地说,我们得到了未定义的JSFunction,但期望得到一个JSFunction。
__cast_accessor_count=0  
CAST_ACCESSOR 101980 JSFunction  
0x486c4135 <undefined>  
case ODDBALL_TYPE: {
  if (IsUndefined())
    accumulator->Add("<undefined>");
0x001e3b4e:                PAUL_DEBUG_BREAK + 0x002e
0x0023d916:_ZN2v88internal10JSFunction4castEPNS0_6ObjectE + 0x0056
0x00251594:_ZN2v88internal7Genesis17InstallJSBuiltinsENS0_6HandleINS0_16JSBuiltinsObjectEEE + 0x0048
0x00250e6c:_ZN2v88internal7Genesis14InstallNativesEv + 0x05e8
0x0025241c:_ZN2v88internal7GenesisC1ENS0_6HandleINS0_6ObjectEEENS_6HandleINS_14ObjectTemplateEEEPNS_22ExtensionConfigurationE + 0x01c4
0x0024ed5a:_ZN2v88internal12Bootstrapper17CreateEnvironmentENS0_6HandleINS0_6ObjectEEENS_6HandleINS_14ObjectTemplateEEEPNS_22ExtensionConfigurationE + 0x0022
0x00247a46:_ZN2v87Context3NewEPNS_22ExtensionConfigurationENS_6HandleINS_14ObjectTemplateEEENS3_INS_5ValueEEE + 0x017e
0x001e3c02:    _ZN16JavascriptEngine4InitEv + 0x007a
v8::internal::JSFunction::cast(v8::internal::Object*)
v8::internal::Genesis::InstallJSBuiltins(v8::internal::Handle<v8::internal::JSBuiltinsObject>)
v8::internal::Genesis::InstallNatives()
v8::internal::Genesis::Genesis(v8::internal::Handle<v8::internal::Object>,     v8::Handle<v8::ObjectTemplate>, v8::ExtensionConfiguration*)
v8::internal::Bootstrapper::CreateEnvironment(v8::internal::Handle<v8::internal::Object>,     v8::Handle<v8::ObjectTemplate>, v8::ExtensionConfiguration*)
v8::Context::New(v8::ExtensionConfiguration*, v8::Handle<v8::ObjectTemplate>,     v8::Handle<v8::Value>)
JavascriptEngine::Init()