`
eric_weitm
  • 浏览: 243562 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

集成spiderMonkey

阅读更多
集成spiderMonkey
文档 :https://developer.mozilla.org/En/SpiderMonkey/JSAPI_User_Guide
https://developer.mozilla.org/en/How_to_embed_the_JavaScript_engine

一、hello world基本流程:
    JS_NewRuntime
    JS_NewContext
    JS_SetOptions
    JS_SetErrorReporter
    JS_NewCompartmentAndGlobalObject ------创建global对象
    JS_InitStandardClasses ---------------- 把运行时内置的函数、对象、常量等作为global object的属性导出
    ok = JS_EvaluateScript(cx, global, script, strlen(script), filename, lineno, &rval); ----解释执行

    if (rval == NULL | rval == JS_FALSE) // 判断运行状态
        return 1;

    str = JS_ValueToString(cx, rval);    // 处理运行结果

二、暴漏c的函数(本地的wrapper是作为js的回调挂上去的)
    本地wrapper的基本格式要求 typedef JSBool (*JSNative)(JSContext *cx, uintN argc, jsval *vp);
    1、返回值是 JSBool(JS_TRUE 正常得到结果,JS_FALSE执行时出现异常)
    2、第一个参数是 JSContext
    3、第二个参数是 argc(js代码中传进来的参数个数)
    4、第三个参数是 jsval *, 可以用来取得参数、this、返回值等
    5、调用成功时 JS_SET_RVAL + return JS_TRUE
       调用失败时 JS_ReportError + return JS_FALSE

三、常用技术
    1、JS_ARGV(cx, vp)  指向参数数组的第一个元素
    2、JS_RVAL(cx, vp)  指向返回值
    3、JS_SET_RVAL(cx, vp, value) 设置返回值
    4、JS_THIS_OBJECT(cx, vp) 取this对象
    5、JS_THIS(cx, vp)    jsVal版本的this
    6、JS_CALLEE(cx, vp)  被调用的函数对象

四、例子
JSBool myjs_rand(JSContext *cx, uintN argc, jsval *vp)
{
    JS_SET_RVAL(cx, vp, DOUBLE_TO_JSVAL(rand()));
    return JS_TRUE;
}

/* A wrapper for the srand() function, from the C standard library.
   This example shows how to handle optional arguments. */
JSBool myjs_srand(JSContext *cx, uintN argc, jsval *vp)
{
    uint32 seed;
     // 把输入的参数转变格式,存入输出中, 参数依次是cx,调用者传入参数个数,传入的参数,输出的格式,输出地址
    if (!JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp), "/u", &seed))
        return JS_FALSE;

    /* If called with no arguments, use the current time as the seed. */
    if (argc == 0)
        seed = time(NULL);

    srand(seed);// 初始化一个种子

    JS_SET_RVAL(cx, vp, JSVAL_VOID);  /* return undefined */
    return JS_TRUE;
}

/* A wrapper for the system() function, from the C standard library.
   This example shows how to report errors. */
JSBool myjs_system(JSContext *cx, uintN argc, jsval *vp)
{
    JSString* str;
    char *cmd;
    int rc;

    if (!JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp), "s", &str))
        return JS_FALSE;

    cmd = JS_EncodeString(cx, str); // js string 转成 c的char *
    rc = system(cmd);
    JS_free(cx, cmd);// 不用了,释放掉
    if (rc != 0) {
        /* Throw a JavaScript exception. */
        JS_ReportError(cx, "Command failed with exit code %d", rc);// 抛出异常给js,js中可以用try catch检测到
        return JS_FALSE;
    }

    JS_SET_RVAL(cx, vp, JSVAL_VOID);  /* return undefined 没有返回值时也要显示的设置一下*/
    return JS_TRUE;
}

      //加入自定义函数
     JSFunctionSpec my_functions[] = {
         JS_FS("myprint", myprint, 0, 0, 0), // 依次是name, notive func, argc, tags, extra
         JS_FS_END
     };

     JS_DefineFunctions(cx, objParent, my_functions);

五、暴漏对象 JS_InitClass + JS_DefineProperties

顺序:
    1、属性id枚举
    2、getter, constructer, destructer
    3、class的template
    4、class的函数表
    5、JS_InitClass
    6、JS_DefineProperties

网上找的一个例子:

***************************************************************************** getter, constructer, destructer******
       // 属性Getter函数
       enum{ EQFRONT, EQBACK, EQSIZE, EQEMPTY, EQARRAY};
       JSBool MyClassGetter(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
       {
           std::deque<int>* pQ = (std::deque<int>*)JS_GetPrivate(cx, obj);
           if(!JSVAL_IS_INT(id)) return JS_TRUE;
           switch(JSVAL_TO_INT(id))
           {
           case EQFRONT:
            if(pQ->empty()) return JS_FALSE;
            *vp = INT_TO_JSVAL( pQ->front() );
            break;

        case EQBACK:
            if(pQ->empty()) return JS_FALSE;
            *vp = INT_TO_JSVAL( pQ->back() );
            break;

        case EQSIZE:
            *vp = INT_TO_JSVAL( pQ->size() );
            break;

        case EQEMPTY:
            *vp = BOOLEAN_TO_JSVAL( pQ->empty() );
            break;

        case EQARRAY: //数组操作
            {
                //用JS_NewArrayObject生成数组
                JSObject *objA = JS_NewArrayObject(cx, 0, NULL);
                jsint idx = 0;

                for(std::deque<int>::iterator itr=pQ->begin(); itr!=pQ->end(); ++itr)
                {
                    jsval v = INT_TO_JSVAL(*itr);
                    //用JS_SetElement加入指定索引的数据
                    JS_SetElement(cx, objA, idx++, &v);
                }
                *vp = OBJECT_TO_JSVAL(objA);
                break;
            }
            break;
        }
        return JS_TRUE;
    }

    // "构造"
    JSBool MyClassConstructor(JSContext *cx, JSObject *obj, uintN argc,
        jsval *argv, jsval *rval)
    {
        std::deque<int> *pQ = new std::deque<int>();
        JS_SetPrivate(cx, obj, pQ);
        return JS_TRUE;
    }

    // "析造"
    void MyClassDestructor(JSContext *cx, JSObject *obj)
    {
        std::deque<int>* pQ = (std::deque<int>*)JS_GetPrivate(cx, obj);
        delete pQ;
    }

******************************************class template*****************************************
    // 定义类
JSClass myClass={
   "MyClass",                         // name
   JSCLASS_HAS_PRIVATE,               // tags
   JS_PropertyStub, JS_PropertyStub,  // 添加、删除属性的回调 默认是 JS_PropertyStub
   MyClassGetter, JS_PropertyStub,    // get set方法
   JS_EnumerateStub,                  // 遍历属性
   JS_ResolveStub,                    // 解析不存在的属性
   JS_ConvertStub,                    // 转成原子类型
   MyClassDestructor                  // 析构函数
};

*******************************************class的函数表***************************************
    // 类方法
    JSBool QPush(JSContext *cx, JSObject *obj, uintN argc,
            jsval *argv, jsval *rval)
    {
        std::deque<int>* pQ = (std::deque<int>*)JS_GetPrivate(cx, obj);
        if(JSVAL_IS_INT(argv[0]))
        {
            pQ->push_back(JSVAL_TO_INT(argv[0]));
        }
        return JS_TRUE;
    }

    JSBool QPop(JSContext *cx, JSObject *obj, uintN argc,
            jsval *argv, jsval *rval)
    {
        std::deque<int>* pQ = (std::deque<int>*)JS_GetPrivate(cx, obj);
        if(!pQ->empty())
        {
            pQ->pop_front();
        }
        return JS_TRUE;
    }

   JSFunctionSpec myClassMethod[]={
       JS_FS("push", QPush, 1, 0, 0),   // 依次是name, notive func, argc, tags, extra
       JS_FS("pop", QPop, 0, 0, 0),
       JS_FS_END
   };

*****************************************JS_InitClass****************************
    JSObject * newobj = JS_InitClass(cx, objParent, NULL, // cx, global obj, prototype,
        &myClass, MyClassConstructor, 0,                  // 类构成模板,构造函数,构造函数参数个数
        NULL, myClassMethod,                              // prototype中的属性和方法
        NULL, NULL);                                      // 构造函数的属性和方法

**************************************JS_DefineProperties************************
    JSPropertySpec myClassProp[]={
        {"front", EQFRONT, JSPROP_READONLY}, // names, c实现中的唯一id, flags,  get函数, set函数
        {"back", EQBACK, JSPROP_READONLY},
        {"size", EQSIZE, JSPROP_READONLY},
        {"empty", EQEMPTY, JSPROP_READONLY},
        {"array", EQARRAY, JSPROP_READONLY},
        {0}
    };

    JS_DefineProperties(cx, newobj, myClassProp);
分享到:
评论

相关推荐

    通过MOZILLA的javascript引擎(SpiderMonkey)执行js代码

    集成SpiderMonkey到VC++项目中,你需要: 1. 添加`js32.dll`作为项目的依赖项,确保在运行时能找到这个库。 2. 引入`jsapi.h`,这样你的C++代码就可以调用JavaScript引擎的接口。 3. 使用`JS_NewContext`函数创建一...

    SpiderMonkey 1.6

    1. **即时编译(JIT)技术**:SpiderMonkey 1.6 集成了先进的即时编译技术,将 JavaScript 代码转换为机器码,显著提升了执行速度。这种技术使得 JavaScript 能够接近甚至超越某些静态编译语言的性能。 2. **垃圾...

    spidermonkey31.2.0开发包

    **SpiderMonkey 31.2.0 开发包详解** SpiderMonkey是Mozilla公司为JavaScript编程语言开发的一个开源、高性能的JavaScript引擎。它以其强大的解析、编译和执行能力,为Web浏览器、服务器、桌面应用程序等多个场景...

    spidermonkey_js32.zip

    总结来说,"spidermonkey_js32.zip"是一个包含32位SpiderMonkey 1.6 release版本的压缩包,它提供了.dll和.lib文件以便在Windows系统上运行和集成JavaScript引擎。这个版本适用于编译像mp4box这样的项目,展示了...

    SpiderMonkey1.6&1.7 编译文件(全部lib,dll,h文件)

    工程实例可能是一个演示如何在Dev-C++中使用SpiderMonkey API的简单项目,这对于学习如何将SpiderMonkey集成到C++项目中非常有帮助。 在实际应用中,例如开发浏览器或者游戏引擎,SpiderMonkey可以被用来执行网页...

    spider monkey+codeblocks 安装及使用demo

    **Spider Monkey与...通过以上步骤,你已经成功地在CodeBlocks中集成了Spider Monkey,并编写了一个简单的示例。继续深入学习,你将能够充分利用Spider Monkey的灵活性和强大功能,为你的C++应用增添动态脚本支持。

    SpiderMonkey_JSAPI

    SpiderMonkey的JSAPI为C/C++开发者提供了一个强大的工具集,使他们能够无缝地集成JavaScript到自己的应用程序中。通过理解和熟练使用这些API,开发者可以构建功能丰富的跨平台应用,利用JavaScript的灵活性和动态...

    spidermonke vs2005 编译 使用文档

    1. 如何在项目中集成SpiderMonkey库。 2. API参考,介绍如何调用和操作JavaScript引擎的功能。 3. 示例代码,展示如何执行JavaScript代码、创建对象、调用函数等。 4. 调试技巧,帮助开发者定位和修复问题。 5. 性能...

    js32.lib sipdermonkey

    "js32.lib" 可能是一个静态链接库,用于在C或C++程序中集成SpiderMonkey JavaScript引擎。 **SpiderMonkey详解** SpiderMonkey是最早的JavaScript引擎之一,自1998年起由Mozilla基金会开发。它的设计目标是提供...

    SpiderMonkey for Objectel Extensions-开源

    对于SpiderMonkey for Objectel Extensions来说,这个"bin"目录很可能包含了集成SpiderMonkey引擎后的Objectel扩展程序的执行文件,或者是用于初始化和配置扩展的工具。用户或开发者可以通过运行这些二进制文件来...

    DCS组态软件中脚本模块的设计实现.pdf

    在具体实现上,DCS组态软件首先需要集成SpiderMonkey引擎。这通常涉及到引擎的编译、链接和配置工作,确保引擎能够在DCS软件环境中正常工作。接着,软件开发者需要创建一个接口,使得用户可以通过这个接口编写和调用...

    SpiderMonkey.jl:用于优化蜘蛛猴的Julia包

    SpiderMonkey.jl包将SMOA算法集成到Julia环境中,为用户提供了一套简洁的接口来解决优化问题。该包可能包含以下功能: 1. 函数接口:用户可以定义自己的目标函数,并通过调用特定的函数来启动优化过程。 2. 参数...

    火狐js引擎

    SpiderMonkey与Firefox浏览器的其他组件紧密集成,比如DOM解析器和CSS样式引擎,共同构成了强大的Web平台。它支持Web Workers,使得JavaScript可以利用多核处理器进行并行计算,提升Web应用的性能。同时,通过WebGL...

    JS_1,70资源库——经过VC.6.0编译,可以直接拿来用

    总的来说,这个JS_1.7.0 SpiderMonkey资源库为那些希望在C或C++项目中集成JavaScript功能的开发者提供了便利,尤其是在需要兼容老版本系统或工具的情况下。然而,对于新项目,建议考虑使用更新的JavaScript引擎以...

    es_runtime:这是Spidermonkey javascript引擎的除锈包装,它使用了mozjs项目

    使用的引擎是Mozilla SpiderMonkey引擎( )。 这个项目起初是我学习防锈的业余爱好项目。我希望你们中的一些人发现对从锈病中使用蜘蛛猴很有帮助。 状态 尚无生产准备就绪,未经测试... 从0.2.0版开始,它可与最新...

    js32.dll和js32.lib

    SpiderMonkey是Mozilla公司开发的一个JavaScript引擎,它是Firefox浏览器内核的一部分,负责解析和执行JavaScript代码。 "js32.dll" 和 "js32.lib" 是与SpiderMonkey 1.6版本相关的动态链接库(Dynamic Link ...

    JavaScript引擎在动态网页采集技术中的应用.pdf

    SpiderMonkey引擎可以轻松地与C++语言集成,从而实现JavaScript引擎的功能。 在测试中,我们使用了SpiderMonkey引擎来提取动态URL,结果表明JavaScript引擎可以成功地提取动态URL,并提高网页采集的效率和准确性。 ...

    JavaScript引擎在动态网页采集技术中的应用

    SpiderMonkey不仅支持标准的ECMAScript规范,还支持一些非标准但实用的扩展特性,如`eval()`、`with`语句等。它具有以下特点: - **开源**:任何人都可以查看其源代码,并对其进行修改和改进; - **灵活**:可以很...

    JS引擎比对.rar

    另一个重要的引擎是SpiderMonkey,它是Mozilla Firefox的一部分,由Mozilla开发。还有Chakra,这是微软Edge浏览器的引擎,现在主要应用于Microsoft的服务器端JavaScript平台,如Azure Functions。 在JavaScript引擎...

    版本号:Firefox 火狐浏览器 21.0

    更新内容: Social API 开始支持多个服务提供商 增强的 DNT(Do Not Track) 选项界面,提供三种选择 ...从 Spidermonkey 中去掉 E4X 支持 在 Firefox 中集成了 add-on SDK 的 API 新增 &lt;main&gt; 元素和 scoped 样式支持

Global site tag (gtag.js) - Google Analytics