一份简单的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++的类对象的一个操作,后面用到的时候,我会再写一篇文章专门讲述类的映射,欢迎大家指正
在使用的过程中,查询了很多网上的资料,但是犹如大多数的内容都是雷同的,并且有一些陈旧,在最新的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++的类对象的一个操作,后面用到的时候,我会再写一篇文章专门讲述类的映射,欢迎大家指正
相关文章推荐
- Linux系统中 eclipse下编译C++(使用v8引擎运行JavaScript脚本)
- 一个简单的使用C++在运行时获取调用堆栈的类
- 教你使用javascript简单写一个页面模板引擎
- 教你使用javascript简单写一个页面模板引擎
- Linux 下使用在C++中V8引擎的环境配置
- Java 中使用rhno引擎,运行JavaScript脚本,实现变量的交互、引入、传递
- [原创]一个简单的使用C++在运行时获取调用堆栈的类
- 怎样管理C++类中的指针成员 和 简单的c++智能指针使用的例子
- Google V8 JavaScript引擎在服务器端的使用
- 谷歌 javascript v8 引擎 5.2版 32位 Debug DLL 分享及使用方法
- 使用 SpiderMonkey 使 C++应用支持 JavaScript 脚本引擎
- Linux下,使用C/C++编写"静态链接库"的一个简单例子
- 使用 SpiderMonkey 使 C++应用支持 JavaScript 脚本引擎
- 使用C++对文件加密的简单例子
- 使用 SpiderMonkey 使 C++应用支持 JavaScript 脚本引擎
- 在使用jQuery+HTML+Javascript的简单例子---很容易的制作双色表格
- 简单使用scipy.weave混合使用Python和C++代码的简单例子
- 在C++中嵌入JavaScript——Google V8 JavaScript Engine使用
- 在C++中嵌入JavaScript——Google V8 JavaScript Engine使用体验
- 在C++中嵌入JavaScript——Google V8 JavaScript Engine使用体验