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 = 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";
}
时间: 2024-10-11 03:30:27

C++调用V8与JS交互的相关文章

与JS交互

类似上面的html, 步奏: 1.定义一个webview 2.懒加载,并导入html文件 3.代理方法,调用js方法,还获得完整URL 4.js的调用方法 与JS交互

iOS JS 交互之利用系统JSContext实现 JS调用oc方法

ios js 交互分为两块: 1.oc调用js 这一块实现起来比较简单, 我的项目中加载的是本地的html,js,css,需要注意的是当你向工程中拖入这些文件时,选择如下操作,(拖入的文件夹是蓝色的,相对路径),不然css,js 的路径会存在问题 加载本地html: oc调用js:一句代码搞定 2.js 调用oc js调用oc又分为两种: 1.js端是直接调用方法 这里就要说到ios7才推出的一个新的api    JavaScriptCore,首先我们引入这个类,并初始化一个JSContext对

关于JS交互--调用h5页面,点击页面的按钮,分享到微信朋友圈,好友

关于js交互,在iOS中自然就想到了调用代理方法 另外就是下面的,直接上代码了: 如果你的后台需要知道你的分享结果,那么,就在回调里面调用上传到服务器结果的请求即可

CEF和JS交互

CefClient提供所有浏览器事件处理的接口,重写CefClient类中的方法处理浏览器事件:包括Browser的生命周期,右键菜单,对话框,状态通知显示,下载事件,拖曳事件,焦点事件,键盘事件,离屏渲染事件等,对Cef进行行为控制的方法一般都集中在这些接口. ① /* 注册浏览器生命周期的事件类CefLifeSpanHandler的实例. 重写CefLifeSpanHandler接口类中的方法实现对browser对象周期回调事件的处理: */ virtual CefRefPtr<CefLif

WebView与Js交互

上周五,老大让暂时搞一个评分app,俩页面.第一个页面显示全部待评分的物业,第二个页面是相应物业的评分页面.评分页面是表格样式的,所以就让web端的同学写个html,我们通过Webview去展示. 这里不不过展示就完了,web页面须要知道我们点击的哪个物业以及所填评委的名字并显示在html上.所以client须要把这两个值传给html.当评委评分完后点击html里的提交button并提交成功后.client也须要进行响应.做法就是client提供接口,js代码去调用来获取值--JS调用Andro

android 与js交互

android与js交互 // 设置编码 webView.getSettings().setDefaultTextEncodingName("utf-8"); // 支持js webView.getSettings().setJavaScriptEnabled(true); //参数1为传递的android对象,参数2为传递对象的变量名称之后JS中使用变量名进行对对象的操作 webView.addJavascriptInterface(new TestJs(), "testO

UIWebView和WKWebView的使用及js交互

UIWebView和WKWebView的使用及js交互 web页面和app直接的交互是很常见的东西,之前尝试过flex和js的相互调用以及android和js的相互调用,却只有ios没试过,据说比较复杂.周末花了点时间研究了一下,确实和其他的不太一样,但是 也不见复杂. 要知道的事情 ios的webview有2个类,一个叫UIWebView,另一个是WKWebView.两者的基础方法都差不多,本文重点是后者,他是取代UIWebView出现的,在app开发者若不需要兼容ios8之前版本,都应该使用

UIWebView,WKWebView 与js交互

现在越来越多的APP需要进行网页之间的交互了,而在iOS中,加载网页的方式为UIWebView与WKWebView这两个控件. 今天就来讲一讲这两个控件怎么进行js交互吧.至于这两个控件之间的区别应该都懂..那我就不说了. 1.UIWebView - (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script; 在UIWebView中提供了这个方法,这个方法就是用来执行js的 <!DOCTYPE h

C#的WEBBROWSER与JS交互的方法(转载)

原地址:http://www.jb51.net/article/57574.htm 本文实例总结了C#的WEBBROWSER与JS交互的方法.分享给大家供大家参考.具体实现方法如下: 一.实现WebBrowser内部跳转,阻止默认打开IE 1.引用封装好的WebBrowserLinkSelf.dll实现 复制代码代码如下: public partial class MainWindow : Window{       private WebBrowser webBrowser = new Web