Calling a v8 javascript function from c++ with an argument
2016-11-22 15:04
381 查看
Calling
a v8 javascript function from c++ with an argument
up vote18down votefavorite 8 | I am working with c++ and v8, and have run into the following challenge: I want to be able to define a function in javascript using v8, then call the function later on through c++. Additionally, I want to be able to pass an argument to the javascript function from c++. I think the following sample source code would explain it best. Check towards the end of the sample code to see what I am trying to accomplish. #include <v8.h> #include <iostream> #include <string> #include <array> using namespace v8; int main(int argc, char* argv[]) { // Create a stack-allocated handle scope. HandleScope handle_scope; // Create a new context. Persistent<Context> context = Context::New(); Context::Scope context_scope(context); Handle<String> source; Handle<Script> script; Handle<Value> result; // Create a string containing the JavaScript source code. source = String::New("function test_function(test_arg) { var match = 0;if(test_arg[0] == test_arg[1]) { match = 1; }"); // Compile the source code. script = Script::Compile(source); // What I want to be able to do (this part isn't valid code.. // it just represents what I would like to do. // An array is defined in c++ called pass_arg, // then passed to the javascript function test_function() as an argument std::array< std::string, 2 > pass_arg = {"value1", "value2"}; int result = script->callFunction("test_function", pass_arg); } Any tips? UPDATE: Based on the advice given, I have been able to put together the following code. It has been tested and works: #include <v8.h> #include <iostream> #include <string> using namespace v8; int main(int argc, char* argv[]) { // Create a stack-allocated handle scope. HandleScope handle_scope; // Create a new context. Persistent<Context> context = Context::New(); //context->AllowCodeGenerationFromStrings(true); // Enter the created context for compiling and // running the hello world script. Context::Scope context_scope(context); Handle<String> source; Handle<Script> script; Handle<Value> result; // Create a string containing the JavaScript source code. source = String::New("function test_function() { var match = 0;if(arguments[0] == arguments[1]) { match = 1; } return match; }"); // Compile the source code. script = Script::Compile(source); // Run the script to get the result. result = script->Run(); // Dispose the persistent context. context.Dispose(); // Convert the result to an ASCII string and print it. //String::AsciiValue ascii(result); //printf("%s\n", *ascii); Handle<v8::Object> global = context->Global(); Handle<v8::Value> value = global->Get(String::New("test_function")); Handle<v8::Function> func = v8::Handle<v8::Function>::Cast(value); Handle<Value> args[2]; Handle<Value> js_result; int final_result; args[0] = v8::String::New("1"); args[1] = v8::String::New("1"); js_result = func->Call(global, 2, args); String::AsciiValue ascii(js_result); final_result = atoi(*ascii); if(final_result == 1) { std::cout << "Matched\n"; } else { std::cout << "NOT Matched\n"; } return 0; } c++ v8 embedded-v8
| ||||||||||||
a comment |
2 Answers
activeoldestvotesup vote11down voteaccepted | I haven't tested this, but it's possible that something like this will work:// ...define and compile "test_function" Handle<v8::Object> global = context->Global(); Handle<v8::Value> value = global->Get(String::New("test_function")); if (value->IsFunction()) { Handle<v8::Function> func = v8::Handle<v8::Function>::Cast(value); Handle<Value> args[2]; args[0] = v8::String::New("value1"); args[1] = v8::String::New("value2"); Handle<Value> js_result = func->Call(global, 2, args); if (js_result->IsInt32()) { int32_t result = js_result->ToInt32().Value(); // do something with the result } } Edit: It looks like your javascript function expects a single argument (consisting of an array of two values), but it kinda looks like we're calling funcby passing in two arguments. To test this hypothesis, you could change your javascript function to take two arguments and compare them, e.g.: function test_function(test_arg1, test_arg2) { var match = 0; if (test_arg1 == test_arg2) { match = 1; } else { match = 0; } return match; }
| ||||||||||||||||
a comment |
up vote2down vote | Another simpler method is as follows:Handle<String> code = String::New( "(function(arg) {\n\ console.log(arg);\n\ })"); Handle<Value> result = Script::Compile(code)->Run(); Handle<Function> function = Handle<Function>::Cast(result); Local<Value> args[] = { String::New("testing!") }; func->Call(Context::GetCurrent()->Global(), 1, args); Essentially compile some code that returns an anonymous function, then call that with whatever arguments you want to pass.
| ||||
|
相关文章推荐
- Dreamweaver 扩展开发: Calling a C++ function from JavaScript
- call a JavaScript function from C++ code
- 今天我在网上找到我教授授课的教科书了.Michael J. Folk, Bill Zoellick, Greg Riccardi, “File Structures: An Object-Oriented Approach with C++”, Addis
- Use Refresh() function right in WebGrid with javascript
- calling c++ function from Lua, implement sleep function
- How to create jigsaw puzzle from an image using javascript(拼图引擎)
- BDNtv: Deriving a model from an existing database with ECO II in Delphi 2005
- Sending e-mail with attachments from an ASP.NET page
- create an process with administrator privilege from service in Vista
- JavaScript Calls from C++
- AHK Calling an lua-function from ahk
- Getting Started With OData Part 2: Building an OData Services from Any Data Source
- An interview with Microsoft's new Visual C++ Architect Stanley Lippman
- Building Automated Trading Systems: With an Introduction to Visual C++.NET 2005
- Beginning JavaScript with DOM Scripting and Ajax: From Novice to Professional
- Calling Lua function from C++
- JavaScript Calls from C++
- 【已解决】Discuz自定义表情后出现array_slice() [function.array-slice]: The first argument should be an array……的解决方法
- Add an Annotation FeatureClass from a Personal Geodatabase to ArcMap with ArcObjects
- 修复 Warning: Array_merge() [function.array-merge]: Argument #1 Is Not An Array... 错误