首页 > 代码库 > C++调用V8与JS交互
C++调用V8与JS交互
C++访问JS函数
C++部分:
/** * COMPILE foo.js AT THE FIRST COMMAND PROMPT TO RUN foo.js */#include <v8.h>#include <iostream>#include <fstream>#include <string>using namespace v8;using namespace std;v8::Handle<v8::String> ReadFile(const char* name);//*******************************// My helpers//*******************************/*** Add[DataType]ToArguments(string/double/bool, Handle<Value>, UINT)* / [datatype] value to assign to argument list* / pass in arguments handle* / position in argument list to* This function will eaily convert and set the values for an argument list* to easily pass into a JS function you are calling from C++* JSEx: Func(arg[0], arg[1], ..)**/void AddStringToArguments(std::string str, Handle<Value> argList[], unsigned int argPos){ argList[argPos] = v8::String::New(str.c_str());}void AddNumberToArguments(double num, Handle<Value> argList[], unsigned int argPos){ argList[argPos] = v8::Number::New(num);}void AddBooleanToArguments(bool value, Handle<Value> argList[], unsigned int argPos){ argList[argPos] = v8::Boolean::New(value);}// Examples of these pass in the Isolite instead of global and create global within shell.cc for example line 99/*** CallJSFunction(Handle<v8::Object>, string, Handle<Value>, UINT)* / Handle of the global that is running the script with desired function* / Title of the JS fuction* / List of arguments for function* / Number of agrguments* Returns the return value of the JS function**/Handle<v8::Value> CallJSFunction(Handle<v8::Object> global, std::string funcName, Handle<Value> argList[], unsigned int argCount){ // Create value for the return of the JS function Handle<Value> js_result; // Grab JS function out of file Handle<v8::Value> value = http://www.mamicode.com/global->Get(String::New(funcName.c_str())); // Cast value to v8::Function Handle<v8::Function> func = v8::Handle<v8::Function>::Cast(value); // Call function with all set values js_result = func->Call(global, argCount, argList); // Return value from function return js_result;}int main(){ //Get the default Isolate Isolate* isolate = Isolate::GetCurrent(); //Create a stack allocated handle scope HandleScope handle_scope(isolate); //Handle<Value> init = Integer::New(x); //Create the global template Handle<ObjectTemplate> global_template = ObjectTemplate::New(); //Create a context Local<Context> context = Context::New(isolate, NULL, global_template); //Set the context scope Context::Scope context_scope(context); Handle<v8::Object> global = context->Global(); string file = "foo.js"; while(true){ cout << "How many times do you want to run the script? \n" << endl; int n; cin >> n; cout << "" << endl; std::cin.get(); Handle<String> source = ReadFile(file.c_str()); if(source.IsEmpty()) { cout << "Error reading file" << endl; cout << "Press enter to quit" << endl; cin.get(); return 0; } //Compile Handle<Script> script = Script::Compile(source); //Run the script and print Handle<Value> result; result = script->Run(); // Once script has ran lets call some Functions!!****************** // Create handle for arguements Handle<Value> args[2]; // Create arguments to be passed into JS function AddStringToArguments("BOSS", args, 0); AddNumberToArguments(5.0, args, 1); // Call the JS function Handle<Value> js_result = CallJSFunction(global, "JSrepeat", args, 2); String::AsciiValue ascii2(js_result); printf("JSrepeat() returned: %s\n", ascii2); // Lets try another JS fucntion call!!***************************** // This function returns the name "Jimmy" with no parameters js_result = CallJSFunction(global, "WhatsMyName", NULL, 0); String::AsciiValue ascii3(js_result); printf("WhatsMyName() returned: %s\n", ascii3); String::AsciiValue ascii(result); cout << "Script result : " ; printf("%s\n", *ascii); } // End of while //Exit program cout << "\nTest completed. Press enter to exit program. \n" << endl; std::cin.get(); return 0;}v8::Handle<String> ReadFile(const char* name){ //Open the file FILE* file; fopen_s(&file, name, "rb"); //If there is no file, return an empty string if (file == NULL) return v8::Handle<v8::String>(); //Set the pointer to the end of the file fseek(file, 0, SEEK_END); //Get the size of file int size = ftell(file); //Rewind the pointer to the beginning of the stream rewind(file); //Set up and read into the buffer char* chars = new char[size + 1]; chars[size] = ‘\0‘; for (int i = 0 ; i < size;) { int read = static_cast<int>(fread(&chars[i], 1, size - i, file)); i += read; } //Close file fclose(file); v8::Handle<v8::String> result = v8::String::New(chars, size); delete[] chars; return result;}
JS部分:
function test_function() { var match = 0; if(arguments[0] == arguments[1]) { match = 1; } return match; }function JSrepeat(name, repeat) { var printthis = ""; for(var i=0; i < repeat; i++){ printthis += name; } return printthis; }function ReturnThis(anything) { return anything; }function WhatsMyName() { return "Jimmy"; }
C++调用V8与JS交互
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。