我正在尝试使用NDK在一个
Android应用程序中嵌入v8.
我有一个看起来像这样的JNI模块(JNI映射代码未显示):
#include
#include
#include
using namespace v8;
static jlong getMagicNumber() {
HandleScope handle_scope;
Persistent context = Context::New();
Context::Scope context_scope(context);
Handle source = String::New("40 + 2");
Handle
Handle 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(
Thread::GetExistingThreadLocal(isolate_key_));
ASSERT(isolate != NULL);
return isolate;
}
这听起来很像this problem,它建议使用v8 :: Locker获得“独立访问隔离”.
通过添加一个简单的Locker l;在getMagicNumber的顶部,崩溃不再发生.当我没有注意时,自我修复的问题很容易打破.
我只有最简单的理解为什么这可以解决我的问题,而且我正在收到编译器警告,我正在以不赞成使用的方式使用v8 :: Locker.推荐的方法是为它提供一个v8 :: Isolate作为v8 :: Locker构造函数的参数,但我不知道我应该如何“获取”一个隔离.
最终:根据v8的当前状态解决这个问题的正确方法是什么?为什么?