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

5 篇文章 0 订阅
4 篇文章 0 订阅

    由于工作的原因,需要在C++ 使用V8引擎运行Javascript 脚本,同时需要实现将 C++中的变量值给入到Javascript中,而在Javascript中改变了值之后,需要同步修改C++中对应的变量;同时也需要时Javascript中调用C++的函数。

   在使用的过程中,查询了很多网上的资料,但是犹如大多数的内容都是雷同的,并且有一些陈旧,在最新的V8代码下并不能够编译运行,因此给出了我自己最后撰写的代码,做一个备份,也希望能给有这方面需要的程序员以一定的帮助

代码如下:

#include <v8.h>
#include <time.h>
#include <cstring>
#include <string>
#include <iostream>

using namespace v8;

int x=10;//定义一个变量,可以在C++和js中实现值的传递

//一个函数,实现在js中调用C++函数
void set_x(const v8::FunctionCallbackInfo<v8::Value>& args){
	x=8;
}

//一个函数,实现在js中调用C++函数
void PrintString(const v8::FunctionCallbackInfo<v8::Value>& args){
	String::Utf8Value str(args[0]);
	printf("day--:%s\n",*str);
}

//变量 x 的读取函数,目的是实现在js中读取C++的变量值
void Getter(Local<String> property,const PropertyCallbackInfo<Value>& info){
	info.GetReturnValue().Set(x);
}


int main(int argc, char* argv[]) {
	//前期的一些准备操作,网上写的很乱,我时没看懂了
	Isolate* isolate = Isolate::New();
	Isolate::Scope isolate_scope(isolate);
	HandleScope handle_scope(isolate);
	Handle<ObjectTemplate> global_templ = ObjectTemplate::New() ;
	Handle<Context> exec_context ;
	Handle<String> js_source ;
	Handle<Script> js_compiled ;

// 写入js代码
  js_source = String::NewFromUtf8(isolate,"var y=0;set_value();y=x+10;put_value(x);");

 //将c++中的函数给到javascript中去,类似于一个映射的方法
	global_templ->Set(String::NewFromUtf8(isolate,"set_value"),FunctionTemplate::New(isolate,set_x)) ;
	global_templ->Set(String::NewFromUtf8(isolate,"print_value"),FunctionTemplate::New(isolate,PrintString)) ;

//将c++中的变量x给到javascript中去,类似于一个映射的方法。
	//但是在V8中,并不是直接给入变量。而是对每个变量,要求要有两个方法,分别实现对变量的读取与写入
	//例如要读取C++中的变量x,就调用方法  Getter(看上面的代码,有定义),在Getter 中将x的值给入进去
	//相同的,如果要在javascript中直接修改X的值,就会用到一个 Putter 方法
	//添加的函数就是     global_templ->SetAccessor(String::NewFromUtf8(isolate,"变量名称"),读取函数,写入函数,);
	//对于不需要修改的变量,可以省略写入函数。
	//在这个例子中,就没有对 X 实现写入操作,因此 SetAccessor 的变量就只有两个了
	global_templ->SetAccessor(String::NewFromUtf8(isolate,"x"),Getter);

// 新建执行对象,把刚刚注册了c++函数的global_templ关联到脚本的运行环境中去
  exec_context = Context::New(isolate,NULL, global_templ) ;
  Context::Scope context_scope(exec_context) ;
  js_compiled = Script::Compile(js_source);

  if(js_compiled.IsEmpty()) {
			printf("run_js, js_compiled is empty!");
    return 0 ;
  }
js_compiled->Run();

这是我目前的一个进展,还没有实验过对C++的类对象的一个操作,后面用到的时候,我会再写一篇文章专门讲述类的映射,欢迎大家指正

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值