Android 用の V8 JavaScript エンジンを静的ライブラリ (libv8arm.a) として正常にコンパイルしました。これを Android ネイティブ C++ アプリ (ndk-r5b を使用) に静的にリンクできます。
Android では、V8 コンテキストが作成されると、このランタイム アサートを取得します ...
// V8 コンテキストを初期化します。
ローカル グローバル = ObjectTemplate::New();
context = Context::New( NULL, globals );
v8/src/objects-inl.h の 1581 行目の致命的なエラー
CHECK(object->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); \
}
... Context::New() を呼び出す前後の値を出力します ...
printf( "__cast_accessor_count=%d\n", v8::internal::__cast_accessor_count );
// Create a new context.
Persistent<Context> context = Context::New();
printf( "__cast_accessor_count=%d\n", v8::internal::__cast_accessor_count );
私のMacOSXテストアプリでは、出力は
__cast_accessor_count=0
(gdb) continue
__cast_accessor_count=272875
Androidでは、アサートを打つ前の出力は
__cast_accessor_count=0
CAST_ACCESSOR 101980 JSFunction
0x486c4135 <undefined>
V8コードを検索して、object->ShortPrint()が「未定義」を出力している場所を見つけたところ、これが見つかりました...
case ODDBALL_TYPE: {
if (IsUndefined())
accumulator->Add("<undefined>");
ODDBALL_TYPE が codegen によって発行されるかどうかは疑問ですが、IA32 アセンブリと ARM アセンブリでは異なります。これにより、プラットフォームごとに異なる初期化が説明される場合があります。
UPDATE2:
ついに有効なコールスタックを取得しました...
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
arm-eabi-c++filt
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()