मैं एनडीके का उपयोग कर एंड्रॉइड एप्लिकेशन में v8 एम्बेड करने की कोशिश कर रहा हूं।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 रिटर्न दूसरी बार मैं चलाने का प्रयास यह, यह दुर्घटनाग्रस्त हो जाता है।
विशेष रूप से, इस 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;
}
यह this problem की तरह एक बहुत कुछ है, जो v8::Locker
का उपयोग कर पता चलता है "अलग के लिए अनन्य पहुँच" प्राप्त करने के लिए लग रहा है।
10 के शीर्ष पर एक साधारण Locker l;
जोड़कर, क्रैश अब नहीं होता है। समस्याएं जो स्वयं को ठीक करती हैं जो आसानी से खुद को तोड़ने लगती हैं जब मैं ध्यान नहीं दे रहा हूं।
मुझे केवल मेरी समस्या को हल करने की सबसे कम समझ है, और मुझे संकलक चेतावनी मिल रही है कि मैं एक बहिष्कृत फैशन में v8::Locker
का उपयोग कर रहा हूं। अनुशंसित विधि को v8::Locker
के कन्स्ट्रक्टर के तर्क के रूप में प्रदान करने के लिए है, लेकिन मुझे नहीं पता कि मुझे एक पृथक "प्राप्त" करने के लिए कैसे माना जाता है।
अंततः: v8 की वर्तमान स्थिति के अनुसार इस समस्या को हल करने का उचित तरीका क्या है, और क्यों?
मैं अभी भी पूरी तरह से समझ नहीं पा रहा हूं कि इनमें से प्रत्येक पंक्ति क्या करती है, लेकिन यह मेरे लिए काम करती है। धन्यवाद। – namuol