SpiderMonkey, 是 Mozilla 项目的一部分, 是一个执行JavaScript脚本的引擎. 它用 C 实现。还有一个叫做 Rhino的Java版本。此外.Net 下也有 SpiderMonkeyDotNet,不过目前还不太成熟。
我记得我以前所在的公司里有一个server tools 开发组,他们做的事情其实就是调用一个 javascript 引擎,将一些对象封装,然后让测试人员可以写 server test 脚本来进行服务端功能的测试。
其实微软也有一个 Javascript 引擎 ActiveX 组件 Microsoft Script Control 1.0,使用起来更加简单方便,有兴趣的可以自己到网上搜索相关的资料。
具体的介绍就不再多说了,网上有不少资料:
官方网站:
http://www.mozilla.org/js/spidermonkey/
看这两篇基本上够了:
功能强大的JavaScript引擎--SpiderMonkey [自由、创新、研究、探索……]
http://www.cnblogs.com/shanyou/archive/2006/10/11/526777.html
使用 SpiderMonkey 使 C++应用支持 JavaScript 脚本引擎 [颓废到底]
http://hi.baidu.com/kuien_jiang/blog/item/7e2cfcddea6be9df8c102956.html
官方的用户指南,网上的文章大部分也是根据这个来的:
https://developer.mozilla.org/en/JavaScript_C_Engine_Embedder%27s_Guide
其实我觉得这个最清楚明了,有空的话我准备把他翻译一下:
JSAPI Phrasebook
https://developer.mozilla.org/En/SpiderMonkey/JSAPI_Phrasebook
我这次做的一个简单的应用,我是想用 javascript prototype 中的 toJSON 功能将字符串转换为 JSON 格式,虽然C++中也有一些 JSON的解决方案,不过用起来都不爽,刚开始 JS_CompileFile 怎么也通不过,后来搞清楚原来是 prototype中使用了很多网页上的对象,document, window之类,这些在普通应用程序中当然没有了,后来我把 prototype改了一下,之留下来那些跟toJSON 有关的东西就OK 了,附上代码:
- void ConvertBufferToJson( char *buf)
- {
- uint32 max_gc_size = (8L * 1024L * 1024L);
- size_t stack_chunk_size = (8192);
- JSRuntime *rt;
- JSContext *cx;
- JSObject *globalObj;
- JSClass global_class = {
- "global" ,0,
- JS_PropertyStub, JS_PropertyStub,JS_PropertyStub, JS_PropertyStub,
- JS_EnumerateStub, JS_ResolveStub,JS_ConvertStub, JS_FinalizeStub };
- /* 初始化JS RunTime,返回结果给rt */
- rt = JS_NewRuntime(max_gc_size);
- if (!rt) return ;
- /* 创建一个上下文,并将其与JS RunTime关联起来 */
- cx = JS_NewContext(rt, stack_chunk_size);
- if (!cx) return ;
- /* 创建全局对象 */
- if (!(globalObj = JS_NewObject (cx, &global_class, NULL, NULL))) return ;
- /* 实例化内置对象和全局对象*/
- JS_InitStandardClasses (cx, globalObj);
- /*执行一段脚本*/
- JSScript* jScript = JS_CompileFile(cx, globalObj, "prototype.js" );
- //JSObject* scriptobj = JS_NewScriptObject(cx, jScript);
- //JS_AddNamedRoot(cx, &scriptobj, "sy_script");
- jsval rval = JSVAL_FALSE;
- JSBool ok = JS_ExecuteScript(cx, globalObj, jScript, &rval);
- rval = JSVAL_FALSE;
- jsval argvs[1];
- argvs[0] = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, buf));
- ok = JS_CallFunctionName(cx, JS_GetGlobalObject(cx), "GetJsonValue" , 1, argvs, &rval);
- JSString *retstr = JS_ValueToString(cx, rval);
- strcpy(buf, JS_GetStringBytes(retstr));
- /*释放上下文*/
- JS_DestroyContext(cx);
- /*释放RunTime*/
- JS_DestroyRuntime(rt);
- }