我正在尝试使用NDK在Android应用中嵌入v8。
我有一个JNI模块,大致如下(未显示JNI映射代码):
我有一个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。当我尝试第二次运行时,它崩溃了。
具体而言,在v8的isolate.h
中看到的ASSERT
失败:
// 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;
}
这听起来很像这个问题,建议使用v8::Locker
获取“独占访问隔离区”。
在getMagicNumber
的顶部添加一个简单的Locker l;
后,崩溃不再发生。这么容易修复的问题往往会在我不注意时出现问题。
我只有最基本的理解,为什么这样可以解决我的问题,并且我收到编译器警告,说明我正在以过时的方式使用v8::Locker
。推荐的方法是向v8::Locker
的构造函数提供一个v8::Isolate
作为参数,但是我不知道该如何“获取”隔离区。
最终:根据v8的当前状态,正确的解决此问题的方法是什么,以及为什么?