使用C++调用V8

Google V8 JavaScript引擎在服务器端的使用 v8简介: V8是一个由丹麦Google开发的开源JavaScript引擎,用于Google Chrome中 V8在执行之前将JavaScript编译成了机器码,而非位元组码或是直译它,以此提升效能。更进一步,使用了如内联缓存(inline caching)等方法来提高性能。有了这些功能,JavaScript程序与V8引擎的速度媲美二进制编译。 V8对外的API接口是C++的 阅读详情

文章来自:https://developers.google.com/v8/get_started


Hello World

下面的C++代码将调用V8的解释器,运行一段js代码。

#include <v8.h>

using namespace v8;

int main(int argc, char* argv[]) {
  // Get the default Isolate created at startup.
  Isolate* isolate = Isolate::GetCurrent();

  // Create a stack-allocated handle scope.
  HandleScope handle_scope(isolate);

  // Create a new context.
  Handle<Context> context = Context::New(isolate);

  // Here's how you could create a Persistent handle to the context, if needed.
  Persistent<Context> persistent_context(isolate, context);
  
  // Enter the created context for compiling and
  // running the hello world script. 
  Context::Scope context_scope(context);

  // Create a string containing the JavaScript source code.
  Handle<String> source = String::New("'Hello' + ', World!'");

  // Compile the source code.
  Handle<Script> script = Script::Compile(source);
  
  // Run the script to get the result.
  Handle<Value> result = script->Run();
  
  // The persistent handle needs to be eventually disposed.
  persistent_context.Dispose();

  // Convert the result to an ASCII string and print it.
  String::AsciiValue ascii(result);
  printf("%s\n", *ascii);
  return 0;
}


在V8中运行js代码,需要一个handles, handle scope和context:

  • handle 是指向js对象的指针。所有的v8对象都关联到一个handle指针,这个指针被V8的垃圾收集器使用;
  • scope可以认为是一组handle的容器。当你使用完这些handle后,你可以简单的删除这个scope,而不必删除每个handle;
  • context是一个可执行环境,可以将js代码分离的运行在不同的v8实例中。要运行js代码,必须创建一个context。

运行

1. 下载和编译V8download and build instructions.

2. 拷贝上面的代码,并存储到一个文本文件hello_world.cpp

3. 编译hello_world.cpp,如在linux上可以这样:

g++ -Iinclude hello_world.cc -o hello_world out/x64.release/obj.target/tools/gyp/libv8_{base,snapshot}.a -lpthread

4. 运行hello_world


在window运行(这部分是本人原创)

注意,我是用VS2010编译和运行的。 v8的可执行库从 http://download.youkuaiyun.com/detail/doon/6442033下载

下面是步骤:

1. 创建一个VS2010 控制台工程,注意,以空项目的方式创建;

2. 添加一个新文件: hello_world.cpp,并把上面的代码拷贝到该文件中,保存;

3. 下载v8_sdk.rar ,解压并放在一个指定位置

4. 打开工程属性页,配置C++头文件:( <path>\v8_sdk\include)


5. 配置lib库的路径(<path>\v8_sdk\lib)



6. 增加库

v8_base.ia32.lib
v8_nosnapshot.ia32.lib
v8_snapshot.lib
icui18n.lib
icuuc.lib
Ws2_32.lib
winmm.lib



7. 编译解决方案并运行。



二、执行v8引擎示例代码 文章里使用v8源代码的目录下的示例代码v8\samples\hello-world.cc // Copyright 2015 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include <stdio.h> #inclu... 阅读详情

相关推荐

​​​​​​​V8引擎扩展的方式 实现cef C++ js交互

交互方法,使用V8引擎扩展的方式 代码来源于网易云信Duilib 一 JS中调用C++中函数 1 v8扩展 渲染器进程中 void ClientApp::OnWebKitInitialized() { /** * JavaScript 扩展代码,这里定义一个 NimCefWebFunction 对象提供 call 方法来让 Web 端触发 native 的 CefV8H...

目前打算换一个工作,有招聘windows c++方向的也欢迎联系,北京、济南 最好 1841

Google V8 引擎 原理详解

Google V8 引擎使用 C++ 代码编写,实现了 ECMAScript 规范的第五版,可以运行在所有的主流 操作系统中,甚至可以运行在移动终端 ( 基于 ARM 的处理器,如 HTC G7 等 )。V8 最早被开发用以嵌入到 Google 的开源浏览器 Chrome 中,但是 V8 是一个可以独立的模块,完全可以嵌入您自己的应用,著名的 Node.js( 一个异步的服务器框架,可以在服务端使用 JavaScript 写出高效的网络服务器 ) 就是基于 V8 引擎的。 和其他 JavaScript

啊渊的专栏 2448

【nodejs】c++ addon 官方例子:nodejs调用c++

例子 构建 #!/bin/sh node-gyp --debug configure build 执行 node index.js C++ addons 是一个胶水层 官方介绍: 动态连接共享库 Addons are dynamically-linked shared objects written in C++. addon库作为一个nodejs的module 加载。 The require() function can load addons as ord.

突围 1144

基于V8引擎的 C++和JS的相互交互

1. 脚本引擎的基本功能 V8只是一个JS引擎。去除它的特点功能出处,它必须要实现JS引擎的几个基础功能: 脚本执行: 脚本可能是一个表达式;一段js代码;或者一个文件 执行表达式返回js表达式对应的值 C++来取设JS的内容 获取JS内容的数据(包括基础数据类型、数组、日期等)、对象(类的一个实例)、类或函数 设置JS内容的数据 JS来取设C++的内容 C++为js...

qq_35886593的博客 2283

v8pp:将C ++函数和类绑定到V8 JavaScript引擎中

v8pp 仅标头的库,用于将C ++类和函数公开到,以便在JavaScript代码中使用它们。 v8pp需要具有C ++ 14支持的编译器。 该库已经过测试: Microsoft Visual C ++ 2019(Windows 10) GCC 5.4.0(Ubuntu 16.04) lang 5.0.0(Ubuntu 16.04) 绑定示例 v8pp支持6.3之后的V8版本,并在API中使用v8::Isolate 。 有两个绑定目标: v8pp::module ,围绕v8::ObjectTemplate的包装器类 v8pp::class_ ,围绕v8::FunctionTemplate的模板类包装器 他们两个都需要一个指向v8::Isolate实例的指针。 它们允许从C ++代码绑定带有函数set(name, item)变量,函数,常量之类的set(name, item) :

解放双手:用KUKA示教器白键一键触发复杂工艺,自定义你的快捷指令

本文详细介绍了如何利用KUKA示教器的工艺白键功能,通过自定义快捷指令一键触发复杂工艺,显著提升自动化产线效率。文章涵盖UserTech技术栈解析、KRL脚本封装、人机交互视觉工程及工业实战策略,帮助工程师实现机械臂操作的高阶优化。

weixin_30379531的博客 432

JavaScript引擎研究与C、C++与互调用(转)

JavaScript引擎研究与C、C++与互调用(转)

whl0071的专栏 3117

从Mate到Mate40 Pro+:华为旗舰核心配置演进与选购避坑指南

本文回顾了华为Mate系列从初代到Mate40 Pro+的核心配置演进历程,重点分析了处理器性能、影像系统、屏幕设计及续航快充的技术突破。针对选购需求,提供了区分版本、5G选择及存储配置的实用避坑建议,帮助消费者明智选择华为旗舰机型。

weixin_30015371的博客 494

python调用v8_C++中使用v8

今天编译了V8,现在V8编译是依赖GYP是谷歌一个用python写的工作方便代码管理,可以生成多种项目文件。1.编译V81.首先下载了VS2010ultimate,安装了SP1补丁,这个补丁一定要装,个人感觉基本都要装SP1,VS2005需要更多补丁2. 安装Cygwin和Python下载GYP工具虽然自己安装了cygwin但是最好还是下载一下,cygwin和python版本最好一致下载 V8源...

weixin_39536728的博客 322

使用GEOquery包下载原始数据

使用GEOquery包下载原始数据

m0_75172651的博客 1894

从ADC校准到精准测量:避开PY32F030小信号采样的那些坑

本文深入探讨了PY32F030微控制器进行ADC小信号采样时面临的挑战与解决方案。从硬件设计、软件滤波算法到系统级校准策略,详细分析了如何避开常见陷阱,实现精准测量,特别是在25mV以下小信号场景中的应用实践。

ujm567890的博客 759

V8概念以及编程入门

v8 知识梳理以及编程入门 学习 v8 编程的好处就是能够知道 node 是如何通过写JavaScript 进行调用系统 API 的,如果你有 c/c++ 又或者是比较底层的语言的基础,研究明白 v8 是如何调用系统底层的,而系统是如何提供函数给 v8 调用的,那么我们对 node 的理解层度就会更上一层楼。 本节主要折腾的几个事情 如何通过 JS 调用 c/c++ 层 如何通过 c/c++ 层调用 JS 层 如何通过 JS 调用 c++ 的类 当我们实现以上的 JS-C/C++ 层的调用时.

啊渊的专栏 2807

汽车工程师必看:从CAN到Ethernet,6种车载通信协议全解析(附应用场景对比)

本文全面解析了从CAN到Ethernet的6种车载通信协议,包括CAN、LIN、MOST、FlexRay等,并对比了它们的应用场景和技术特点。文章详细介绍了各协议的演进历程、技术优势及在现代汽车中的混合网络架构设计,为汽车工程师提供了实用的协议选型指南和未来通信技术发展趋势。

weixin_28683689的博客 492

V8引擎静态库及其调用方法

本V8引擎静态库分为x86版本和x64版本 V8引擎静态库下载地址 编译工具:VS2019 v8开头的即为V8引擎静态库(附送其它开源静态库libuv.lib、zlib.lib等_) 如何调用V8引擎 1、下载v8静态库到本地 2、配置开发环境 将上述v8的include目录配置到“附加包含目录”配置项中 根据你的开发环境配置不同版本的lib库(注意debug和release),如下: 3、调用代码如下,需要创建一个控制台程序 #include <iostream> #include

lgsoftlee的博客 2969

基于STM32F4的NRF24L01驱动程序

基于STM32F4xx的NRF24L01驱动程序 提示:硬件平台基于STM32F427VIT6、NRF24L01模块 文章目录基于STM32F4xx的NRF24L01驱动程序前言一、NRF24L01简单介绍1,什么是NRF24L012,NRF24L01通信方法3,NRF24L01通信原理4,地址分配&通道分配问题二、STM32CubeMX配置三、添加底层文件1,添加.c/.h文件到工程中2,使用说明四,下载 前言 提示:本例程采用STM32CubeMX配置底层,采用硬件SPI方式驱动NRF24

qq_43603289的博客 2814

后仿真中的必懂VCS仿真选项之initreg和deposit

后仿真中,我们常常对于没有复位寄存器和存储器单元,使用仿真选项之initreg和deposit,两种处理方式。今天做总结。请注意:请勿将两者进行同时使用。对于到底选取哪种方式,要结合实际的情况决断。但是,两者同时使用,会有冲突,得不到预期结果。

那么菜的博客 4331

一份简单的C++ 使用V8引擎运行Javascript 的例子

由于工作的原因,需要在C++ 使用V8引擎运行Javascript 脚本,同时需要实现将 C++中的变量值给入到Javascript中,而在Javascript中改变了值之后,需要同步修改C++中对应的变量;同时也需要时Javascript中调用C++的函数。    在使用的过程中,查询了很多网上的资料,但是犹如大多数的内容都是雷同的,并且有一些陈旧,在最新的V8代码下并不能够编译运行,因此给出

a137993530的博客 3857

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

使用 Google V8 引擎开发可定制的应用程序

Google V8 引擎使用 V8 引擎是 Google 的一个开源项目,是一个高效的 JavaScript 引擎,它可以作为一个独立的库被嵌入到已有的 C++ 应用之中,为软件的灵活性,扩展性提供可能。使用 V8 的另外一个好处是,你不需要重新学习一本脚本语言,JavaScript 已经广泛的被开发人员,尤其是前端开发人员所使用。 V8 引擎概览 V8

flyonok的专栏 2681

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

v8学习---c++调用js构造函数

#include using namespace v8; int main() { Isolate* isolate = Isolate::GetCurrent(); HandleScope handleScope(isolate); Handle context = Context::New(isolate); Context::Scope context_s

headool的专栏 1792

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

nodev8 c++调用

c++ 调用v8 引擎 , 使用javascript代码以前写的,谁有用拿去好了

qianbo042311的博客 500

Node.js 调用 C++ 方法 / C++ Addons 详解

最近开发涉及到了一些Node.js调用C++的地方,于是网上搜了一下,发现网上好多文章都是比较片面的东西,没法直接使用。于是花点时间总结一下。 Android开发中Java 调用C++的部分叫JNI,Rust语言中调用C++的部分叫FFI,Node.js中调用C++的部分叫C++ Addons。 本文总结Node.js使用非N-API方式调用C++函数的示例,主要针对node 8版本,不同版本会有api差异。 Node.js 调用C++方法,其实是调用 C++ 代码生成的动态库,可以使用require(.

彼此当年少,莫负好时光 1万+

v8使用简解

首先到google开发者网站上下载v8源码,并按照说明进行编译。   在v8中,编译和执行的js代码需要依付于一个空间(上下文)。上下文由Context::New创建。 static Persistent New(       ExtensionConfiguration* extensions = NULL,       Handle global_template = Handle(

tiewen的专栏 1698

Calling a v8 javascript function from c++ with an argument

Calling a v8 javascript function from c++ with an argument up vote18down votefavorite 8 I am working with c++ and v8, and have run into the following challenge: I

linuxheik的专栏 876

【跨语言调用-1】

概述 QML,V8,CEF中都涉及到C++和JavaScript之间的调用。 QML QML调用C++ 定义C++类,类需要继承QObject,在类中添加Q_OBJECT宏;信号函数、public槽函数可以在QML中访问;public普通成员函数,需要用Q_INVOKABLE标记才能在QML中访问;成员属性,需要定义setter和getter函数,并通过Q_PROPERTY注册,才能在QML中访问。 #include <QObject> // 需要派生自QObject class CppO

weixin_44304929的博客 1381

args.Holder()关于v8 Javascript engine 的使用方法研究 (二

原文地址:http://blog.chinaunix.net/uid-8272118-id-2033360.html by 北京理工大学  20981  陈罡 一、写在前面的话 上回写到了关于如何在c++的代码中嵌入v8引擎,实现javascript脚本中调用c++的函数以及从c++函数中调用javascript脚本中定义的函数(这其实就是设计模式中所谓的reflection,反射机

linuxheik的专栏 1212
上一篇: 产品黏度和用户体验
下一篇: 在C++中嵌入V8
漂流的代码
博客等级 码龄23年 188粉丝 99原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值