Cocos2d-x的SprideMonkey的JavaScript与C++的交互(一) - 函数操作
来源:互联网 发布:c语言标准函数库下载 编辑:程序博客网 时间:2024/05/25 19:58
最近也是换了份新工作.搞棋牌平台了...标新立异呵呵.哥哥使用node.js来开发这套东东..公司什么底子也没有.在西安就这样吧......
最近正在搞 扑克... 由于是服务器很多逻辑都是js的所以..希望cocos2d-x的客户端也可以js搞起..但是已经用c++写的很多了.怎么办呢......这就牵扯js和c++的交互问题了.
需求:
1.c++可以注册到javascript里面函数.
2.然后js可以调用这个函数.
3.并且能收到这个函数的返回值.
4.c++可以主动调用这个函数并传入参数.
呵呵.写到这块是不是感觉和Lua神似了...对呀.JS也是脚本..最近我的新宠. 回头TS也要准备支持Js的调试的.尽请期待.书归正传..先谈谈.cocos2d-x搞什么飞机了.让c++可以使用js的...答案是.spidermonkey这个东东...哦.火狐的js心脏啊..懂了吧..好了.这个蜘蛛猴子.被封装的很友好了.所以咱们直接可以用cocos2d-x的ScriptingCore::getInstance()来获取到有用的东东.当然注册函数这个cocos2d-x没给...还有好多函数是个 直接return 0 我去..看代码没把我笑死哈哈...
有图有真相...哥哥从来不骗人.!~好了.不说这个了..如果说写代码的时候感觉见鬼了..看看源码还是有好处的.
1.如果想在c++里面注册一个JS函数..需要使用JS_DefineFunction.这个函数是 蜘蛛猴的函数..咱们可以直接使用的.比如我想闹个叫TS_Out的函数.然后有n个参数.那么就可以这样写.
- void TSScriptJS::Init()
- {
- ScriptingCore* sc = ScriptingCore::getInstance();
- JSFunction* pF = JS_DefineFunction(sc->getGlobalContext(), sc->getGlobalObject(), "TS_JSOut",
- TSScriptJS::TS_JSOut, 0, JSPROP_READONLY | JSPROP_PERMANENT);
- }
下面是回调:
- JSBool TSScriptJS::TS_JSOut( JSContext *cx, uint32_t argc, jsval *vp )
- {
- if (argc > 0) {
- JSString *string = NULL;
- JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp), "S", &string);
- if (string) {
- JSStringWrapper wrapper(string);
- //这块就有值了
- }
- }
- return JS_TRUE;
- }
然后JS里面就可以这样调用了.
- TS_JSOut("Timeshift This is Awesome Engine!");
2.c++可以主动调用这个函数并传入参数.这个功能非常重要.因为c++为主要的开发中,主要是需要js的这种交互操作的.就是说..c++需要js里面的值
- jsval TSScriptJS::JSCallFuncName(const char *name, int count, ...)
- {
- ScriptingCore* sc = ScriptingCore::getInstance();
- int argc = count;
- jsval res;
- jsval *argv = new jsval[count];
- va_list insvalist;
- va_start(insvalist,count);
- for (int i = 0; i < count; ++i)
- {
- argv[i] = std_string_to_jsval(sc->getGlobalContext(),std::string(va_arg(insvalist,const char *)));
- }
- va_end(insvalist) ;
- JS_CallFunctionName(sc->getGlobalContext(), sc->getGlobalObject(), name, argc, argv, &res);
- delete [] argv;
- return res ;
- }
然后会返回一个 jsval.这个是个非常强大结构..他可以是任何类型的东西.spidermonke给了很多函数.cocos2d-x也给了很多来转化这个类型到熟知的c++类型.
- jsval pR = TSScriptJS::GetSingleTon()->JSCallFuncName("TS_JSMain",3,"haha!","hoho!","heihei!");
- JSString* pS = JS_ValueToString(ScriptingCore::getInstance()->getGlobalContext(), pR);
- JSStringWrapper pW(pS);
- CCLog(pW.get().c_str());
- function TS_JSMain(v1,v2,v3) {
- try
- {
- cc.log(v1+v2+v3);
- }
- catch(e)
- {
- cc.log("出事了!!" + e);
- return;
- }
- return "TimeShift is Awesome!";
- }
好了变量什么的读取和写值.请见下一节..!
- Cocos2d-x的SprideMonkey的JavaScript与C++的交互(一) - 函数操作
- Cocos2d-x的SprideMonkey的JavaScript与C++的交互
- Cocos2d-x的SprideMonkey的JavaScript与C++的交互
- Cocos2d-x的SprideMonkey的JavaScript与C++的交互(三) - 全局变量Obj的操作
- Cocos2d-x的SprideMonkey的JavaScript与C++的交互(四) - 灰常好用的一个函数eval
- Cocos2d-x的SprideMonkey的JavaScript与C++的交互 - 单个全局变量操作
- Cocos2d-x的SprideMonkey的JavaScript与C++的交互(二) - 单个全局变量操作
- Cocos2d-x的SpiderMonkey的JavaScript与C++的交互(一) - 函数操作
- Cocos2d-x的SpiderMonkey的JavaScript与C++的交互(三) - 全局变量Obj的操作
- Cocos2d-x的SpiderMonkey的JavaScript与C++的交互(二) - 单个全局变量操作
- Objective-C与JavaScript的简易交互操作
- javascript 与 Object-C 的交互-(一)
- cocos2d-x 通过JNI实现c/c++和Android的java层函数交互
- cocos2d-x 通过JNI实现c/c++和Android的java层函数交互
- 在VS2010下cocos2d-x与Lua的交互
- Cocos2d-x与Android交互需要用到的技术JNI
- Objective-C与JavaScript的交互
- Objective-C与JavaScript的交互
- Flatten Binary Tree to Linked List
- 什么和什么 是什么呢
- 六个小办法处理电脑开机速度慢的问题【386w】
- C++资源之不完全导引(完整版)
- Nexus 7二代 新Nexus 7 中文版ROOT教程
- Cocos2d-x的SprideMonkey的JavaScript与C++的交互(一) - 函数操作
- python学习总结--字典
- 实现声音开关的代码
- flying saucer 中文不显示、以及中文换行的问题解决
- 网页中flash wmode属性你会用吗?
- QT中QWS的含义
- ios教你如何用Camera作为你view的背景
- @override在MyEclipse和Eclipse中报注解annotation错误
- poj 2478 Farey Sequence