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

2024-07-04

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

我有一个看起来像这样的 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。第二次我尝试运行它时,它崩溃了。

具体来说,这ASSERT在 v8 中看到isolate.h fails:

// 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;
}

听起来很像这个问题 https://groups.google.com/forum/?fromgroups=#!topic/v8-users/Px0JcsfDjYA,这建议使用v8::Locker获得“对该隔离区的独家访问权”。

通过添加一个简单的Locker l;到顶部getMagicNumber,不再发生崩溃。当我不注意时,那些可以自行解决的问题很容易就会自行破坏。

我对为什么这能解决我的问题只有最微弱的理解,并且我收到了我正在使用的编译器警告v8::Locker以一种已弃用的方式。推荐的方法是为其提供一个v8::Isolate作为一个论据v8::Locker的构造函数,但我不知道如何“获得”隔离。

最终:根据v8的当前状态,解决这个问题的正确方法是什么,以及why?


据我了解,V8 隔离是 V8 运行时的一个实例,包含堆、垃圾收集器和零个或多个 V8 上下文。分离株是not线程安全并且必须通过以下方式进行保护v8::Locker.

一般来说,要使用 V8,您必须首先创建一个isolate:

v8::Isolate* isolate = v8::Isolate::New();

然后,要使用任何线程的隔离:

v8::Locker locker(isolate);
v8::Isolate::Scope isolateScope(isolate);

此时,线程拥有隔离并可以自由创建上下文、执行脚本等。

现在,为了非常简单的应用程序的利益,V8 提供了默认隔离并放宽了锁定要求,但只有当您始终从同一线程访问 V8 时,您才能使用这些拐杖。我的猜测是您的应用程序失败了,因为第二个调用是从不同的线程进行的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 v8::Locker 的正确方法是什么?为什么必须使用它? 的相关文章

  • Java并发hashMap检索

    ConcurrentHashMap文档说 检索操作 包括 get 通常不会阻塞 因此可能与更新操作 包括 put 和 remove 重叠 检索反映了最近完成的更新操作在其开始时的结果 更正式地说 给定键的更新操作与报告更新值的该键的任何 非
  • getInstance() 不适用于实时数据库中除 us-central1 之外的其他位置

    我正在尝试将用户凭据保存到 Firebase 实时数据库 但是 当我执行该程序时 数据库没有更新 我已正确配置 Firebase 设置 因为身份验证和存储 均为 Firebase 正在运行 build gradle dependencies
  • 如何在 ADF Oracle 11gR1 中的对话框窗口中的弹出窗口中刷新表

    我正在研究显示一个带有搜索表的弹出窗口的要求 当用户单击弹出窗口中的搜索按钮 提供输入文本框 时 需要使用新的数据集刷新搜索表 我创建了一个populateSearchTable 通过填充数组中的值来生成表的方法deviceListArra
  • Java JDK中有并发List吗?

    如何创建一个并发 List 实例 在其中可以按索引访问元素 JDK 有我可以使用的类或工厂方法吗 ConcurrentLinkedQueue 如果您不关心基于索引的访问 而只想要列表的插入顺序保留特性 那么您可以考虑java util co
  • 寻找关于 JIDE 的反馈 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Android onBackPressed() 没有被调用?

    在我的 MainActivity 从 AppCompatActivity 扩展 中 我想重写 onBackPressed 方法 如下所示 Override public void onBackPressed Log d MainActivi
  • 如何在 IE 受信任的根证书颁发机构存储中自动安装自签名证书

    我创建了一个自签名证书 但浏览器告诉我 此 CA 根证书不受信任 要启用信任 请在受信任的根证书颁发机构存储中安装此证书 我通过进入 IE gt Internet 选项 gt 内容 gt 证书 gt 等 我实际上必须导出自签名证书 然后将其
  • SonarQube 不会通过 Gradle 显示每个文件的完全覆盖类的详细报告

    我正在 IntelliJ Java IDE 中运行 Gradle 构建 这SonarQube 跑步者 http www gradle org docs current userguide sonar runner plugin htmlGr
  • 从用户操作中禁用整个活动

    有没有一种简单的方法来禁用用户与活动交互 当有一个操作正在运行时执行 并且标题栏中有一个旋转的进度条 编辑 看来我还不够清楚 我的意思是 虽然我已经有一个旋转的进度条 但用户仍然可以按活动上的任何按钮 我想禁止用户在任务正在运行 然而 我不
  • CLASSPATH 中存在未使用的 JAR 文件的影响

    我在这里阅读了很多有关可用工具的问答unusedJAR 例如 loosejar http code google com p loosejar 类路径助手 http classpathhelper sourceforge net 我的问题是
  • 以编程方式将项目添加到相对布局

    我一直在到处寻找这个问题的答案 我是 Android 新手 尝试通过 java 而不是 xml 以编程方式将项目添加到相对布局 我创建了一个测试类来尝试一下 但项目不断堆叠而不是正确格式化 我现在只想将一个 TextView 放在另一个下面
  • 使用 v8::Locker 的正确方法是什么?为什么必须使用它?

    我正在尝试使用 NDK 将 v8 嵌入到 Android 应用程序中 我有一个看起来像这样的 JNI 模块 未显示 JNI 映射代码 include
  • GWT 的图表和绘图 API

    我正在尝试找到一个可以在 GWT 中使用 java 而不是 javascript 使用的图表和绘图 api 我遇到的唯一问题是我发现需要互联网连接的代码将无法连接到互联网 有谁知道这样的API吗 这是我找到的 但又无法使用 https co
  • 在带有效果的 Android 按钮中使用图像

    现在我在 StackOverflow 上遇到了相关问题 但不幸的是没有一个解决方案对我有用 这就是为什么我不得不单独问这个问题 我是 Android 新手 问题 我需要一个充当按钮的图像 现在我明白 这可以通过在标准按钮上使用图像或使用称为
  • 避免 xjc 生成的代码出现编译器警告

    我的根本问题是如何从 未经检查的泛型类型 Eclipse 编译器警告中受益 但问题视图中没有这些警告列表 这些警告被 xjc 从 xsd 文件生成的 java 类的噪声污染 通过 maven jaxb2 插入 我读过其他地方 我可以忽略每个
  • 版本升级后异常

    使用 Optaplanner v7 11 0 Final 的项目上出现分数持久性问题 我升级到最新版本 v7 25 0 Final 但出现以下异常 The externalObject Etat super DbObject id 11 l
  • android finish() 方法不会从内存中清除应用程序

    我有一个活动 我调用 finish 方法 但该活动没有从内存中清除 调用 finish 后 我看到 onDestroy 方法已成功执行 并且我清除了其中的所有变量和内容 应该从内存中清除它还是android的工作方式 据我了解 活动的生命周
  • Android RecyclerView:拖放多个ViewType

    I implement drag and drop for a RecyclerView it works well when have one View type but reset the RecyclerView when have
  • java中的长轮询

    我已经编写了用于长轮询的服务器端代码 我想用java写客户端程序 因此 根据长轮询 客户端发送一个由服务器帮助的请求 当事件发生时服务器响应该请求 然后客户端发送新的请求 所以我面临的麻烦是用java编写的客户端 发送请求后 如何继续检查客
  • 滚动后 ListView 未显示正确的值

    在我的应用程序中我使用的是CustomListView与ArrayAdapter显示不同国家的时间 但在 6 到 7 行之后 取决于手机屏幕尺寸 时间值会重复 根据之前的一些文章 我编写了以下代码片段来获得解决方案 但问题仍然存在 以下是我

随机推荐

  • Androidx 模块,android:attr/ttcIndex 和 android:attr/fontVariationSettings 未找到

    我正在将所有支持 appcompat 库迁移到 androidx 所有更新后 由于此错误 我无法构建我的项目 app processDebugManifest UP TO DATE AGPBI kind error text error r
  • 处理 jQuery 中的所有事件类型

    在使用 jQuery 的应用程序中 我希望每次触发任何类型的事件 包括自定义事件 时都记录到控制台 无论如何 是否可以在不修改 jQuery 源代码并且不绑定到每个可能的事件类型的长列表的情况下执行此操作 var oldTrigger jQ
  • pyqt 中的代码编辑器示例

    我尝试学习一些Qt PyQt 为此 我使用了代码编辑器示例 http doc qt io qt 4 8 qt widgets codeeditor example html的文档 当前行的突出显示效果很好 但行号不显示 实际上LineNum
  • 即使授予用户组完全权限后也无法在 C:\ProgramData\ 中创建文件

    我们有一个应用程序尝试写入 C ProgramData 文件夹中的 Access 数据库 mdb 在启用 UAC 的计算机上 我们发现访问数据库失败 因为它似乎无法创建锁定文件 默认情况下 可能是由于 UAC 用户 包括管理员 似乎没有写入
  • Rails 3 Observer——希望学习如何为多个模型实现观察者

    我想添加一个 Auditor Observer 它可以在创建 3 个模型 书籍 人物 作者 后随时执行操作 我最近听说了观察者功能 但找不到任何有关该功能的文档 Rails 3 支持吗 如何创建一个 Auditor Observer 来为
  • R as.POSIXct() 删除小时、分钟和秒

    我正在尝试用 R 来分析一些测量数据 我有一个 csv 文件 其中包含超过 200 万条测量线 这是一个例子 2014 10 22 21 07 03 00 00 7432442 0 2014 10 22 21 07 21 00 00 743
  • 禁用 Android Monkey 上的系统级事件

    当猴子测试我的应用程序时 adb shell monkey p com foo bar throttle 1000 v 14400 我注意到它可以访问我设备上的各种系统设置 例如音频控制和屏幕截图 根据http developer andr
  • 使用 gdb 在 xv6 上调试用户代码

    我正在做一个基于 xv6 的操作系统类 并且编写了一个需要在其上运行的程序 我知道我可以调试内核代码make qemu gdb但我不知道如何调试我自己的用户程序 假设我想调试cat 我该怎么做呢 Thanks 附 不是有xv6标签吗 这个问
  • Gitweb 失败:致命:refs/heads/master 缺少对象 0000000000000000000000000000000000000000 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试将 gitweb 与一组由
  • 错误:“访问受限 URI 被拒绝”

    访问受限 URI 被拒绝 代码 1012 中断此错误 xhttp send null function getXML xml file if window XMLHttpRequest var xhttp new XMLHttpReques
  • 如何使用生产存储桶数据启动 Firebase 存储模拟器?

    我正在使用 Firebase 模拟器来运行所有 Firebase 服务 我已成功通过运行以下命令来运行模拟器并备份 Firestore 数据 firebase emulators start import my directory 但我找不
  • Chart.js 忽略画布高度和宽度

    继Chart js 文档 http www chartjs org docs getting started creating a chart我正在尝试绘制一个小图表
  • 无堆栈协程与堆栈协程有何不同?

    背景 我问这个问题是因为我目前有一个具有许多 数百到数千 线程的应用程序 这些线程中的大多数在很大一部分时间内处于空闲状态 等待将工作项放入队列中 当工作项可用时 它会通过调用一些任意复杂的现有代码来处理 在某些操作系统配置上 应用程序会遇
  • 输入与输出上的 HTML/XSS 转义

    从我所看到的一切来看 对用户输入的内容转义 html 为了防止 XSS 的目的 的惯例似乎是在渲染内容时执行此操作 大多数模板语言似乎默认都会这样做 我遇到过类似的事情这个 stackoverflow 答案 https stackoverf
  • Scala:使用具体类型实现 Map

    我在 Scala 类型系统中遇到了某种怪癖 这让我有点困惑 我正在尝试创建一个扩展 Map String String 的类 但我不太清楚如何以编译器接受的方式实现 方法 这是我现在的代码 class ParamMap val pairs
  • SerializeObject 抛出 System.OutOfMemoryException

    我对 JsonConvert SerializeObject 有一个严重的问题我需要序列化超过500 000条字典记录才能使序列化抛出以下错误 System OutOfMemoryException 我尝试在 foreach 中单独序列化每
  • GWT 无法从 Hibernate 序列化我的对象

    这是我收到的错误 我到处寻找答案 但我无法弄清楚为什么其他人没有遇到同样的问题 当我从 Hibernate 检索 Proposal 对象时 会发生错误 该对象在作者和顾问这两个属性上具有 User Info 多对一约束 如果需要 我可以提供
  • 以编程方式将项目添加到相对布局

    我一直在到处寻找这个问题的答案 我是 Android 新手 尝试通过 java 而不是 xml 以编程方式将项目添加到相对布局 我创建了一个测试类来尝试一下 但项目不断堆叠而不是正确格式化 我现在只想将一个 TextView 放在另一个下面
  • OpenCL 中的重叠传输和设备计算

    我是 OpenCL 的初学者 我很难理解某些东西 我想改进主机和设备之间的图像传输 我制定了一个计划来更好地了解我 顶部 我现在拥有的 下图 我想要的 HtD 主机到设备 和DtH 设备到主机 是内存传输 K1 和 K2 是内核 我考虑过使
  • 使用 v8::Locker 的正确方法是什么?为什么必须使用它?

    我正在尝试使用 NDK 将 v8 嵌入到 Android 应用程序中 我有一个看起来像这样的 JNI 模块 未显示 JNI 映射代码 include