Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用v8::Locker的正确方法是什么?为什么必须使用它?_Java_Android_Java Native Interface_V8 - Fatal编程技术网

Java 使用v8::Locker的正确方法是什么?为什么必须使用它?

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作

我正在尝试使用NDK将v8嵌入到Android应用程序中

我有一个类似以下内容的JNI模块(未显示JNI映射代码):

这听起来很像,它建议使用
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);