您的位置:首页 > Web前端 > JavaScript

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

2015-05-13 19:19 1611 查看
    由于工作的原因,需要在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++的类对象的一个操作,后面用到的时候,我会再写一篇文章专门讲述类的映射,欢迎大家指正
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ javascript linux v8