NDKを使用してAndroidアプリケーションにv8を埋め込もうとしています。
次のようなJNIモジュールがあります(JNIマッピングコードは表示されていません)。
#include <jni.h>
#include <android/log.h>
#include <v8.h>
using namespace v8;
static jlong getMagicNumber() {
HandleScope handle_scope;
Persistent<Context> context = Context::New();
Context::Scope context_scope(context);
Handle<String> source = String::New("40 + 2");
Handle<Script> script = Script::Compile(source);
Handle<Value> result = script->Run();
context.Dispose();
return result->NumberValue();
}
初めて実行するgetMagicNumber
と、正しく実行され、42が返されます。2回目に実行しようとすると、クラッシュします。
具体的にはASSERT
、v8で見られるこれはisolate.h
失敗します:
// Returns the isolate inside which the current thread is running.
INLINE(static Isolate* Current()) {
Isolate* isolate = reinterpret_cast<Isolate*>(
Thread::GetExistingThreadLocal(isolate_key_));
ASSERT(isolate != NULL);
return isolate;
}
これは、この問題によく似ています。これはv8::Locker
、「分離株への排他的アクセス」を取得するために使用することを示唆しています。
Locker l;
の上部にシンプルを追加することgetMagicNumber
で、クラッシュが発生しなくなりました。私が注意を払っていないときに簡単に自分自身を壊す傾向がある自分自身を修正する問題。
これで問題が解決する理由については、ほとんど理解しv8::Locker
ていません。また、非推奨の方法で使用しているコンパイラの警告が表示されます。推奨される方法は、のコンストラクターv8::Isolate
への引数としてを提供することv8::Locker
ですが、分離を「取得」する方法がわかりません。
最終的に:v8の現在の状態に応じて、この問題を解決する適切な方法は何ですか。また、その理由は何ですか。