Próbuję osadzić v8 w aplikacji dla systemu Android przy użyciu NDK.Jaki jest poprawny sposób użycia v8 :: Locker i dlaczego muszę go używać?
Mam moduł JNI, który wygląda mniej więcej tak (JNI kod mapowania nie pokazano):
#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();
}
Pierwszy raz uruchomić getMagicNumber
, to działa prawidłowo i zwraca 42. drugi raz próbuję uruchomić to się zawiesza.
Konkretnie, to widać w ASSERT
V8 isolate.h
zawiedzie:
// 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;
}
To brzmi trochę jak this problem, co sugeruje użycie v8::Locker
uzyskanie "wyłączny dostęp do izolowania".
Po dodaniu prostego Locker l;
do góry getMagicNumber
, awaria już nie występuje. Problemy, które same się naprawiają, łatwo się łamią, kiedy nie zwracam na to uwagi.
Mam tylko najsłabsze zrozumienie, dlaczego to rozwiązuje mój problem, i otrzymuję ostrzeżenia kompilatora, że używam v8::Locker
w przestarzałym stylu. Zalecaną metodą jest dostarczenie jej z v8::Isolate
jako argumentu konstruktora, ale nie mam pojęcia, jak mam "uzyskać" izolat.
Ostatecznie: Jaki jest właściwy sposób rozwiązania tego problemu zgodnie z obecnym stanem v8 i dlaczego?
Nadal nie w pełni rozumiem, co każdy z tych wierszy robi, ale to działało dla mnie. Dzięki. – namuol