Tôi đang cố gắng nhúng v8 vào ứng dụng Android bằng NDK.Cách chính xác để sử dụng v8 :: Locker là gì và tại sao tôi phải sử dụng nó?
Tôi có một mô-đun JNI trông giống như thế này (mã lập bản đồ JNI không hiển thị):
#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();
}
Lần đầu tiên tôi chạy getMagicNumber
, nó chạy một cách chính xác và trả về 42. Lần thứ hai tôi cố gắng chạy nó, nó bị treo.
Cụ thể, ASSERT
này thấy trong v8 của isolate.h
thất bại:
// 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;
}
Nghe có vẻ rất giống this problem, mà cho thấy sử dụng v8::Locker
để có được "độc quyền truy cập đến cô lập".
Bằng cách thêm Locker l;
đơn giản lên đầu getMagicNumber
, sự cố không còn xảy ra nữa. Các vấn đề khắc phục bản thân dễ dàng có xu hướng phá vỡ bản thân khi tôi không chú ý.
Tôi chỉ có hiểu biết nhiều nhất về lý do tại sao điều này khắc phục sự cố của tôi và tôi nhận được cảnh báo trình biên dịch mà tôi đang sử dụng v8::Locker
theo cách không được chấp nhận. Phương pháp được đề xuất là cung cấp phương thức này với một số v8::Isolate
làm đối số cho hàm tạo của v8::Locker
, nhưng tôi không biết làm cách nào để "có được" một cách ly.
Cuối cùng: Cách thích hợp để giải quyết vấn đề này theo trạng thái hiện tại của v8 là gì và lý do tại sao?
Tôi vẫn chưa hiểu đầy đủ những gì từng dòng đó thực hiện, nhưng điều này hiệu quả với tôi. Cảm ơn. – namuol