VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 3100|回复: 3

[分享] SpiderMonkey_31.2.0版编程笔记 一

[复制链接]
04_avatar_middle
online_vip 发表于 2015-9-15 11:16:26 | 显示全部楼层 |阅读模式
本帖最后由 liehuo 于 2015-9-17 08:51 编辑

我为什么会写这个笔记?因为我发现从我发表《Windows系统编译制作SpiderMonkey最新版mozjs-31.2.0版本》这个帖子以来这么长时间了,无论是在网络上怎么搜索都搜索不出来关于SpiderMonkey-31.2.0版的编程示例,即使是在官网的编程指南里也找不到全面的示例代码。官网的示例很多都是从以前的版本里复制出来的。网上搜索到的大多是关于1.8.5版本的。然而两个版本的api有着很大的区别,很多都已经被废除了,使用新的api函数代替了。我在想为什么不使用新的版本呢?新的版本肯定更加成熟,更全面。可是我当初学习的时候同样是遇到找不到相关的示例代码的烦恼。可我花了差不多一个礼拜的时间自己研究琢磨,翻阅源码里的测试代码(测试代码写的太乱了,而且不全面),加上官网查api,再一步步的调试,终于整理出了一套让人容易接受的编程规范。写出的这些代码示例都放在我的电脑硬盘里,一直也没有拿出来共享,直到前几天有个人通过那篇编译spidermonkey的帖子的联系方式加我的QQ号找到我,向我询问如何编程。我才把那些代码共享给了他。我突然有了为何不写个帖子发表出来让大家都能共享的想法出来。既可以方便别人,又可以得到别人的指正错误,互相学习,何乐而不为呢?
今天就来个简单的小例子吧,从hello world入手,这是官方网站的小demo:
  1. #include "stdafx.h"
  2. #include "include/jsapi.h"
  3. #pragma comment(lib,"lib/mozjs-31.lib")//这里直接用这种方式,是为了观看方便
  4. using namespace JS;
  5. static JSClass global_class = {
  6.         "global",
  7.         JSCLASS_GLOBAL_FLAGS,
  8.         JS_PropertyStub,          //增加属性
  9.         JS_DeletePropertyStub,    //删除属性
  10.         JS_PropertyStub,          //获取属性
  11.         JS_StrictPropertyStub,    //设置属性
  12.         JS_EnumerateStub,
  13.         JS_ResolveStub,
  14.         JS_ConvertStub
  15. };

  16. void ExecScript(JSContext *cx)
  17. {
  18.         JSObject *obj = JS_NewGlobalObject(cx, &global_class, nullptr, FireOnNewGlobalHook);//创建一个新的JavaScript对象用作一个全局对象,但是要被根化这里没有被根化
  19.         //RootedObject global(cx, JS_NewGlobalObject(cx, &global_class, nullptr, FireOnNewGlobalHook));//上面和下面的可以并作中间的这一句。分开写是为了循序渐进
  20.         RootedObject global(cx, obj);//在当前的上下文环境,用创建的全局对象创建根化的全局对象
  21.         
  22.         JSAutoCompartment ac(cx, global);//进入新全局对象的隔室,好像干什么坏事总是见不得人,非要躲在包厢里做坏事一样
  23.         JS_InitStandardClasses(cx, global);//初始化全局对象和其它js里的常规对象
  24.         RootedValue rval(cx); //创建一个RootedValue变量用于接收执行的结果,而这个结果的值是一个要被根化的值
  25.         char* script = "'hello '+'world, it is '+new Date()";
  26.         const char *filename = "noname";
  27.         int lineno = 1;
  28.         bool ok = JS_EvaluateScript(cx, global, script, strlen(script), filename, lineno,&rval);//编译并执行脚本
  29.         if (!ok)
  30.           return ;
  31.         JSString *str = rval.toString();
  32.         printf("%s\n", JS_EncodeString(cx, str));
  33. }
  34. int _tmain(int argc, _TCHAR* argv[])
  35. {
  36.         JS_Init();     //初始化JS引擎,一定要有这步,不然其它的操作都是扯淡
  37.         JSRuntime *rt = JS_NewRuntime(8L * 1024 * 1024, JS_USE_HELPER_THREADS);//创建运行时,是不是跟以前的不一样了
  38.         if (!rt)
  39.                 return 1;
  40.         JSContext *cx = JS_NewContext(rt, 8192);//创建一个JS上下文,与运行时关联起来
  41.         if (!cx)
  42.                 return 1;
  43.         //****************************************************************************************
  44.         ExecScript(cx);
  45.         //****************************************************************************************
  46.         JS_DestroyContext(cx);//销毁创建的上下文
  47.         JS_DestroyRuntime(rt);//销毁释放运行时
  48.         JS_ShutDown();        //释放js引擎使用的所有资源
  49.         return 0;
  50. }
复制代码

为了代码的清晰便于阅读,我们没有添加错误报告的回调函数。运行结果如图:
SpiderMonkey_31.2.0版编程笔记 一
上一篇:Windows系统编译制作SpiderMonkey最新版mozjs-31.2.0版本
下一篇:SpiderMonkey_31.2.0版编程笔记 二___变量操作

评分

参与人数 3驿站币 +5 +2 热心值 +3 收起 理由
24_avatar_small jingjinghack + 1 + 1 赞一个!
24_avatar_small bacsj118 + 2 + 2 支持原创!
51_avatar_small Syc + 2 + 2 很给力!

查看全部评分





上一篇:求一个自绘的ClistControl
下一篇:SpiderMonkey_31.2.0版编程笔记 二___变量操作
51_avatar_middle
online_admins 发表于 2015-9-16 11:32:34 | 显示全部楼层
如果大家学习的过程中都像楼主这样用心,一定都能成为高手
93_avatar_middle
在线会员 发表于 2017-11-5 11:32:07 | 显示全部楼层
请问下如何静态编译啊~~~~~~我生成的静态文件使用无法解析

错误        31        error LNK2019: 无法解析的外部符号 "__declspec(dllimport) bool __cdecl JS_StrictPropertyStub(struct JSContext *,class JS::Handle<class JSObject *>,class JS::Handle<struct jsid>,bool,class JS::MutableHandle<class JS::Value>)" (__imp_?JS_StrictPropertyStub@@YA_NPAUJSContext@@V?$Handle@PAVJSObject@@@JS@@V?$Handle@Ujsid@@@3@_NV?$MutableHandle@VValue@JS@@@3@@Z),该符号在函数 "void __cdecl `dynamic initializer for 'global_class''(void)" (??__Eglobal_class@@YAXXZ) 中被引用        d:\documents\visual studio 2013\项目\Win32Project1\Win32Project1\Win32Project1.obj
05_avatar_middle
在线会员 发表于 2019-4-25 16:37:09 | 显示全部楼层
感谢楼主的奉献
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-5-23 12:12

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表