NDK kullanarak bir Android uygulamasında v8 gömmek çalışıyorum.v8 :: Locker'ı kullanmanın doğru yolu nedir ve neden kullanmalıyım?
ben bu (gösterilmemiştir JNI'yı haritalama kodu) gibi görünür JNI modülü vardır:
#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();
}
ben getMagicNumber
ilk çalıştırdığınızda, doğru çalışır ve ben çalıştırmayı deneyin ikinci kez 42. döndürür o, çöker.
Özellikle, v8 en isolate.h
görülen bu ASSERT
başarısız: Bu "izolatı için özel erişim" elde etmek v8::Locker
kullanarak önerir this problem gibi bir sürü sesler
// 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;
}
.
getMagicNumber
'un sonuna basit Locker l;
ekleyerek, kilitlenme artık oluşmaz. Kendileriyle ilgilenen problemleri, dikkat etmediğimde kolaylıkla kırılma eğilimi gösterir.
Bu sorunun neden giderildiğini en çok anlayan anlayışa sahibim ve v8::Locker
'u kullanımdan kaldırılmış bir şekilde kullanıyorum derleyici uyarıları alıyorum. Önerilen yöntem,'un yapıcısına bir argüman olarak v8::Isolate
sağlamaktır, ancak bir izolatı nasıl elde edeceğimi bilmiyorum.
Sonuçta: Bu sorunu v8'in geçerli durumuna göre çözmek için uygun yol nedir ve neden?
Hala bu satırların her birinin ne yaptığını anlamıyorum, ama bu benim için çalıştı. Teşekkürler. – namuol