Sto cercando di incorporare v8 in un'applicazione Android che utilizza NDK.Qual è il modo corretto di usare v8 :: Locker e perché devo usarlo?
Ho un modulo di JNI che sembra qualcosa di simile (JNI codice di mappatura non mostrato):
#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();
}
La prima volta che corro getMagicNumber
, esso viene eseguito correttamente e restituisce 42. La seconda volta che provo a correre esso, si blocca.
In particolare, questo ASSERT
visto in v8 di isolate.h
fallisce:
// 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;
}
Suona un po 'come this problem, che suggerisce di utilizzare v8::Locker
per ottenere "accesso esclusivo al isolare".
Aggiungendo un semplice Locker l;
all'inizio di getMagicNumber
, l'arresto non si verifica più. Problemi che si sistemano e che tendono facilmente a infrangersi quando non presta attenzione.
Ho solo la più tenue comprensione del motivo per cui questo risolve il mio problema, e sto ricevendo avvisi del compilatore che sto usando v8::Locker
in modo deprecato. Il metodo consigliato è di fornirgli un v8::Isolate
come argomento per il costruttore di v8::Locker
, ma non ho idea di come debba "ottenere" un isolato.
In definitiva: qual è il modo corretto per risolvere questo problema in base allo stato attuale di v8 e perché?
Non riesco ancora a comprendere appieno cosa fanno ciascuna di quelle linee, ma questo ha funzionato per me. Grazie. – namuol