一、众所周知,v8引擎在谷歌浏览器中大放异彩,这得益于v8引擎对于js脚本的无与伦比的执行效率。谷歌浏览器作为v8引擎的宿主,它也只不过是一个普通的桌面程序。当然我们也可以结合实际应用场景编写应用程序去充分利用v8引擎提供给我们的高效的脚本执行效率。合理的用脚本去做一些数据处理和逻辑处理的工作可以去节省大量的时间。试想一下如果我们的应用程序的编译时间很长或者重启的时间很长,这个时候如果我们对代码只是做一些微调的话就要重新编译的话、是不是黄花菜都凉了。这时候就是需要脚本登场的时候了,很显然我们更倾向于选择优秀的脚本引擎,那就v8吧。
1、以下例子程序中使用已经编译好的64位的v8、具体编译步骤可以自行百度。
版本信息为
编译好的v8目录结构如下
2、开发环境使用的是 vs,例子程序只包含一个cpp文件,代码如下
// V8CPPDemo.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <libplatform.h>
#include <v8.h>
using namespace v8;
#pragma comment(lib,"v8.dll.lib")
#pragma comment(lib,"v8_libplatform.dll.lib")
void testExecString(v8::Local<v8::Context> context, v8::Isolate* isolate);
void testExecFunction(v8::Local<v8::Context> context, v8::Isolate* isolate);
v8::Isolate* isolate = NULL;
void print(const FunctionCallbackInfo<Value>& args) {
if(args[0]->IsString()){
printf("is string:%d\n", Isolate::GetCurrent());
v8::String::Utf8Value val(isolate,args[0]);
printf("【参数:%s】\n",*val);
}
args.GetReturnValue().Set(134);
};
int wmain(int argc, wchar_t *argv[])
{
if(argc == 1){
printf("【1:testExecString】\n【2:TEST_EXEC_Function】\n please input the option number");
return 0;
}
if(wcscmp(argv[1],L"1") == 0){
#define TEST_EXEC_STRING
}
else if(wcscmp(argv[1], L"2") == 0){
#define TEST_EXEC_Function
}
else{
printf("wrong number:[%ls]\n",argv[1]);
return 0;
}
v8::Platform* platform = v8::platform::CreateDefaultPlatform();
v8::V8::InitializePlatform(platform);
V8::Initialize();
Isolate::CreateParams params;
params.array_buffer_allocator = ArrayBuffer::Allocator::NewDefaultAllocator();
isolate = Isolate::New(params);
v8::HandleScope handle_scope(isolate);
v8::Local<v8::Context> context = v8::Context::New(isolate);
Persistent<Context> persistent_context(isolate, context);
Context::Scope context_scope(context);
#ifdef TEST_EXEC_STRING
testExecString(context,isolate);
#endif
#ifdef TEST_EXEC_Function
testExecFunction(context,isolate);
#endif
v8::V8::TerminateExecution(isolate);
isolate->Dispose();
v8::V8::Dispose();
v8::V8::ShutdownPlatform();
delete params.array_buffer_allocator;
printf("complete \n");
exit(0);
return 0;
}
void testExecString(v8::Local<v8::Context> context,v8::Isolate* isolate){
Local<String> source = v8::String::NewFromUtf8(isolate, "'中国人'.concat('5555')");
Local<Script> script = Script::Compile(source);
v8::Local<v8::Value> result = script->Run(context).ToLocalChecked();
String::Utf8Value val(isolate, result->ToString(isolate));
printf("str is %s\n", *val);
}
void testExecFunction(v8::Local<v8::Context> context, v8::Isolate* isolate) {
auto global = context->Global();
v8::Local<v8::Function> localFunc = v8::Function::New(isolate,print);
v8::Local<v8::Value> funcValue = v8::Local<v8::Value>::Cast(localFunc);
global->Set(v8::String::NewFromUtf8(isolate, "print"),funcValue);
Local<String> source = v8::String::NewFromUtf8(isolate, "(function(a,b,c){print(\"cppa\",2,2.2);return 'v8';})");
v8::Local<v8::Value> result = Script::Compile(source)->Run(context).ToLocalChecked();
v8::Local<v8::Function> func = v8::Local<v8::Function>::Cast(result);
v8::Local<v8::Value> callRes;
v8::Local<v8::Value> arg;
func->Call(context, Null(isolate), 0, &arg).ToLocal(&callRes);
v8::String::Utf8Value strRes(isolate,callRes);
printf("strRes:%s\n",*strRes);
}
3、头文件包含目录与库文件引用目录如下
4、编译运行
下图为编译结果
以下为运行结果