问题标签 [embedded-v8]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - Android NDK链接V8静态库:找不到符号,但它们在那里
我一直在把头发拉出来。我正在 Ubuntu 12.04 64 位上开发。我创建了一个嵌入了 V8 的原生 Android 应用程序,但重新启动计算机后,它不再与 V8 链接!我尝试重新安装 ndk 并重新编译 V8,但无济于事。看起来链接器确实包含静态库,但没有在其中找到符号。我用nm检查过,符号似乎在那里。
当我运行 ndk_build 时,我得到以下输出:
特别是,这一行告诉我 *.a 文件包括在内:
我的 Android.mk 看起来像这样:
LOCAL_STATIC_LIBRARIES 顺序是凭经验确定的。我又摆弄了一些,但无济于事。我什至尝试了 LOCAL_WHOLE_STATIC_LIBRARIES。我用 nm 检查了符号的存在:
我不是命名专家,但似乎他们在那里。这些值都是零,但我相信这是正常的。
所以我想,也许链接器不理解静态库,它会默默地失败。
但是我如何检查为什么链接器无法拾取符号?
node.js - 运行 V8 javascript 引擎的示例代码时出错
尝试在链接 1 处运行代码时出现以下错误。请帮助解决此问题
------------------------------------错误开始------------ --------------------------
------------------------------------错误结束------------ --------------------------
我使用下面的链接 2 安装了 V8。我安装了它的 64 位版本
v8 - 在 v8 中两次运行相同代码的正确方法(数组越界在第二次运行时失败 - 去优化器)
以下程序基于 v8入门页面中的示例。我进行了三处更改以演示我遇到的问题:
- 我创建了一个空数组,将其放入全局上下文中。
- 正在运行的脚本引用数组中的第零个元素,该元素应返回未定义。
- 我运行编译的脚本两次。
第一次运行正常。第二个失败:v8 在 Deoptimizer::DoComputeCompiledStubFrame() 中调用 V8_Fatal() 因为descriptor->register_param_count_ == -1。
我在这里做错了吗?我该如何解决?
笔记:
- 这是 main() 的整个主体。
- 其他 JavaScript 代码片段运行两次都没有问题。不知何故,这与超出范围的数组引用有关,这可能会触发去优化。
- 我不想每次都从头开始重新编译脚本,因为我通常会运行这些脚本数千次,有时甚至数百万次。
- 我曾尝试将脚本编译为 UnboundScript,然后为每次执行绑定它,但结果是一样的。
- 我已将此报告为v8 问题,但没有人回应,所以我希望 StackOverflow 社区可以提供帮助。
- 我在 VS2012 Update 4 上看到了这一点,但我也在 VS2008、x64 和 x86 以及调试和发布版本中看到了它。
javascript - V8 Javascript 引擎:v8::Arguments 和函数模板
我包装了一个 C++ 标准库std::map<T1,T2>
,我想将它作为 Node.JS 插件公开。我想要两个函数,Set
用于向哈希表添加新值,以及Get
从地图中查找值。我想要一个适用于“任意”类型的函数。这意味着Get
必须从中提取类型T1
的值Args[0]
(注意Args
是 type v8::Arguments
)。请参阅下面的代码。
有没有办法做到这一点?如果是,这样做的方法是什么?
如果无法提取任意类型,如果我愿意限制为几种预定义类型,最佳实践是什么?例如,T=int
、T=std::string
、T=MyType1
和T=MyType2
。
javascript - Google V8 引擎能否在不同线程的不同上下文中同时运行不同的 Javascript?
我计划在我的 C++ 应用程序中嵌入 Google V8,这是一个多线程进程。我需要同时运行多个 Javascript。我可以创建多个 V8 上下文并在不同的线程中同时在不同的上下文中运行不同的 Javascript 吗?每个上下文都不需要与其他上下文进行通信。我只想要没有锁或等待脚本并发执行。谢谢!
v8 - 如何输入 v8::Persistent在多线程环境中?
我试图设置一个多线程环境,可能会不断输入/退出多个 v8::Isolate 对象以编译和运行一些 JavaScript 代码。我有一个方法应该在特定的隔离/上下文中编译和运行 som javascript 代码:
正如您在代码中的注释中看到的那样,它不起作用。我只想输入一个特定的 Isolate 和一个 Persistent。我怎么做?
提前致谢!
c++ - 继承 node::objectWrap 与类包装器
假设我有一个 C++ 类:
我可以通过两种方式将此类绑定到 Node:
方法一——直接继承node::objectWrap
通过这种方式,我直接编辑类结构。但是有一个更简单的方法,那就是:
方法二 - 在内部保持对原始类的引用
注意方法二 cClassWrapper
只有一个内部字段,即internal_
. SimplycClassWrapper
是一个用户cClass
并且其内部没有cClass
被触及。
显然,方法 II 更容易实现,因为类结构cClass
没有受到影响,但我想知道它的缺点是什么(如果有的话?)。internal_
当我四处走动时, v8 的垃圾收集器会不断删除cClassWrapper
吗?
我不确定这两种实现之间的区别是什么。
c++ - 创建不同的 v8 上下文,它们是另一个的克隆
使用 Google 的 v8 c++ 库,我想创建一个上下文,其中我定义了多个模板、变量和全局变量,并准备好供代码中的多个位置使用,这些位置可能在不同的线程上运行,每个线程都有自己的隔离,它们也应该在其中每个线程都有自己的本地上下文副本,因此对一个线程中全局变量的任何更改都不会影响其他线程。
每次我想要一个新的上下文时,我都可以通过显式设置所有模板、变量和全局变量来做到这一点,但我想知道是否有更有效的方法。假设我已经有一个代表主状态的全局 v8::Isolate 指针和 v8::Persistent。那么我需要做什么,如果我想在自己的线程中创建一个全新的隔离,并创建一个本质上是 master 克隆的新上下文?我知道我可以在对主服务器的访问周围包装一个互斥锁,以确保不同的线程在必要时不会同时访问它。我只是不知道如何有效地将在一个隔离区中生成的信息复制到另一个隔离区,而无需从头开始重新创建其全部内容。
c++ - 在 v8 中检测无限递归
我正在使用 google 的 v8 javascript 引擎在我的项目中拥有一个嵌入式 js 解释器,它必须能够执行用户提供的代码,但我想知道是否可以在调用任何用户代码之前进行设置以确保如果代码试图无限期地递归(或者即使它只是执行太久),它可以以某种方式中止,抛出一个未捕获的异常,并将问题报告给调用者。
到目前为止,谢谢大家的回复......是的,我在发布这篇文章后不久就意识到,我基本上是在寻求某种解决停止问题的方法,我知道这是无法解决的,实际上远远超出了我的实际需要。
我需要的是某种机制来检测在 v8 环境中运行的某些东西何时足够快地返回,或者只是一种检测递归是否发生的机制......我的用例是最终用户不应该无论如何都在使用任何递归,如果我什至可以检测到这一点,那么我可以在那时拒绝它,而不是盲目地执行它。但是,对于具有不同隔离的不同线程,可以同时调用相同的函数,因此我不能只使用静态局部变量来锁定对同一函数的另一个调用。
c++ - 尝试嵌入 v8 的链接器错误
我正在尝试制作一个嵌入 Google 的 V8 Javascript 引擎的简单程序。这些说明看起来很简单,但我遇到了一个奇怪的链接错误。
我在 Mac OS X 10.9 上,我使用 Xamarin Studio 作为我的 IDE,它似乎使用 g++ 作为编译器。
我使用他们网站上的说明编译了 v8 。具体来说,毕竟make dependencies
,我跑了:
这似乎成功完成。
这是我尝试构建项目时得到的输出:
我有一种感觉,我编译了 v8 错误,或者可能是针对不同的编译器,但我找不到任何方法来定制它。有没有其他人看过这个?