Java 使用v8::Locker的正确方法是什么?为什么必须使用它?
我正在尝试使用NDK将v8嵌入到Android应用程序中 我有一个类似以下内容的JNI模块(未显示JNI映射代码): 这听起来很像,它建议使用Java 使用v8::Locker的正确方法是什么?为什么必须使用它?,java,android,java-native-interface,v8,Java,Android,Java Native Interface,V8,我正在尝试使用NDK将v8嵌入到Android应用程序中 我有一个类似以下内容的JNI模块(未显示JNI映射代码): 这听起来很像,它建议使用v8::Locker来获得“对文件的独占访问权” 通过添加一个简单的Locker l到getMagicNumber的顶部,崩溃不再发生。当我不注意的时候,那些容易自我修复的问题往往会自我破坏 我对为什么这样解决我的问题只有最模糊的理解,而且我收到了编译器警告,我正在以一种不推荐的方式使用v8::Locker。推荐的方法是为它提供一个v8::Isolate作
v8::Locker
来获得“对文件的独占访问权”
通过添加一个简单的Locker l
到getMagicNumber
的顶部,崩溃不再发生。当我不注意的时候,那些容易自我修复的问题往往会自我破坏
我对为什么这样解决我的问题只有最模糊的理解,而且我收到了编译器警告,我正在以一种不推荐的方式使用v8::Locker
。推荐的方法是为它提供一个v8::Isolate
作为v8::Locker
的构造函数的参数,但我不知道应该如何“获取”一个隔离
最终:根据v8的当前状态,解决此问题的正确方法是什么?为什么?据我所知,v8隔离是v8运行时的一个实例,包含堆、垃圾收集器和零个或多个v8上下文。隔离不是线程安全的,必须通过
v8::Locker
进行保护
通常,要使用V8,必须首先创建一个隔离:
v8::Isolate* isolate = v8::Isolate::New();
然后,要使用“与任何线程隔离”:
v8::Locker locker(isolate);
v8::Isolate::Scope isolateScope(isolate);
此时,线程拥有隔离,可以自由创建上下文、执行脚本等
现在,为了非常简单的应用程序的好处,V8提供了一个默认的隔离并放松了锁定要求,但是如果您总是从同一个线程访问V8,则只能使用这些拐杖。我猜您的应用程序失败了,因为第二次调用来自不同的线程。我现在正在学习V8,但我认为您需要调用: v8::储物柜(隔离) 这将创建一个堆栈分配的Locker对象,该对象将阻止隔离在另一个线程上使用。当当前函数返回此堆栈时,将自动调用对象的析构函数,从而解锁隔离 您需要拨打以下电话: v8::Isolate::Scope isolateScope(隔离) 这将设置运行此隔离的当前线程。隔离只能在一个线程上使用。锁柜强制执行此操作,但需要为当前线程配置隔离本身。这将创建一个堆栈分配对象,该对象指定与当前线程关联的隔离。就像Locker一样,当这个变量超出作用域时(当当前函数返回时),就会调用作用域析构函数来取消将隔离设置为默认值。我认为这是必要的,因为许多V8 API调用需要一个对隔离的引用,但不要将其作为参数。因此,他们需要一个可以直接访问(可能通过每线程变量)的线程
Isolate::Scope类只需在构造函数中调用Isolate::Enter(),在析构函数中调用Isolate::Exit()。因此,如果您想要更多的控制,您可以自己调用Enter()/Exit()。我仍然不完全理解这些行的作用,但这对我来说是有效的。谢谢
v8::Isolate* isolate = v8::Isolate::New();
v8::Locker locker(isolate);
v8::Isolate::Scope isolateScope(isolate);