cocos2dx手写js绑定C++
这两天连续查阅了js绑定c++的非常多文章 , 有手动与自己主动两种方式 .
本来想用自己主动绑定的 , 可是NDK一直下载不下来.....就给算了 .
以下总结一下手动绑定的实现过程 :
一共三步 : 1 . 写原始 C++ 类 ( 一般放在自己定义类库里 )
2. 用 C++ 逐个写 成员函数相应 的 绑定代码 ( 在自己定义类库中建立的manual_binding目录里)
3. 注冊所绑定过的函数( 在AppDelegate.cpp中 加入注冊函数 )
4. 写js代码測试效果
1 . 原始C++类 :
//test.h
#include "cocos2d.h"
USING_NS_CC;
class testbang
{
public:
testbang();
~testbang(); };
//test.cpp
#include "test.h" testbang::testbang()
{
CCLog("testmyfirstbinding ctor ");
}
testbang::~testbang()
{
CCLog("testmyfirstbinding destroy");
}
2.相应的绑定函数
// jsb_test.h
#ifndef TestJavascript_jsb_test_h
#define TestJavascript_jsb_test_h #include "jsapi.h"
#include "jsfriendapi.h" void register_jsb_test(JSContext* cx, JSObject* global); #endif
//jsb_test.cpp
#include "jsb_test.h"
#include "ScriptingCore.h"
#include "test.h" //USING_NS_CC_EXT; JSClass *js_test_class;
JSObject *js_test_prototype; JSBool js_test(JSContext *cx, uint32_t argc, jsval *vp)
{
if (argc == 0) {
// 调用 C++ 构造函数
testbang* cobj = new testbang();
JSObject *obj = JS_NewObject(cx, js_test_class, js_test_prototype, NULL);
JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(obj));
// 构造 js 端对象。将 cobj 实际对象存入
js_proxy_t* p = jsb_new_proxy(cobj, obj);
JS_AddNamedObjectRoot(cx, &p->obj, "TY_test");
return JS_TRUE;
}
JS_ReportError(cx, "wrong number of arguments: argc, was expecting %d. argc must be 0 ", argc);
return JS_TRUE;
}
// 虚拟机垃圾回收时的回调函数,第一个參数代表runtime,第二个是被垃圾回收的js对象
void js_test_finalize(JSFreeOp *fop, JSObject *obj) {
CCLOG("jsbindings: finalizing JS object %p (TY_TCP)", obj);
}
// 入口
void register_jsb_test(JSContext *cx, JSObject *global) { js_test_class = (JSClass *)calloc(1, sizeof(JSClass));
js_test_class->name = "TY_test";
js_test_class->addProperty = JS_PropertyStub;
js_test_class->delProperty = JS_PropertyStub;
js_test_class->getProperty = JS_PropertyStub;
js_test_class->setProperty = JS_StrictPropertyStub;
js_test_class->enumerate = JS_EnumerateStub;
js_test_class->resolve = JS_ResolveStub;
js_test_class->convert = JS_ConvertStub;
js_test_class->finalize = js_test_finalize;
js_test_class->flags = JSCLASS_HAS_RESERVED_SLOTS(2); // 要注冊的属性
static JSPropertySpec properties[] = {
// 脚本层自己通过回调来设定当前的连接状态,这里就不设置了
// {"curState", 0, JSPROP_ENUMERATE | JSPROP_PERMANENT | JSPROP_SHARED, JSOP_WRAPPER(js_tuyoo_TCPSocket_get_curState), NULL},
{0, 0, 0, 0, 0}
}; // 实例函数
static JSFunctionSpec funcs[] = { JS_FS_END
}; // 类函数
static JSFunctionSpec st_funcs[] = {
JS_FS_END
}; js_test_prototype = JS_InitClass(
cx, global,
NULL,
js_test_class, // 虚拟机内的JSClass类
js_test, 0, // 构造函数
properties,
funcs,
NULL, // no static properties
st_funcs); // JSObject* obj = JS_NewObject(cx, NULL, NULL, NULL); // 这个相应一个js的构造函数。在js中使用 new TY_TCP()的方式来使用这个native的类
// JSObject* jsclassObj = JSVAL_TO_OBJECT(anonEvaluate(cx, global, "(function () { return TY_TCP; })()")); // 注冊到全局变量中
JSBool found;
JS_SetPropertyAttributes(cx, global, "TY_TCP", JSPROP_ENUMERATE | JSPROP_READONLY, &found);
}
3 . 注冊绑定函数
//AppDelegate.cpp
#include "manual_bindings/jsb_test.h"
//bool AppDelegate::applicationDidFinishLaunching()
sc->addRegisterCallback(register_jsb_test);
4 . 写js代码測试
var testobj = new TY_test();
输出 :testmyfirstbinding ctor
cocos2dx手写js绑定C++的更多相关文章
- 手写js面向对象选项卡插件
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- 手写JS无缝滚动插件
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- vue10行代码实现上拉翻页加载更多数据,纯手写js实现下拉刷新上拉翻页不引用任何第三方插件
vue10行代码实现上拉翻页加载更多数据,纯手写js实现下拉刷新上拉翻页不引用任何第三方插件/库 一提到移动端的下拉刷新上拉翻页,你可能就会想到iScroll插件,没错iScroll是一个高性能,资源 ...
- 手写js代码(一)javascript数组循环遍历之forEach
注:原文地址http://blog.csdn.net/oscar999/article/details/8671546 我这里是仿照学习! 1.js的数组循环遍历 ①数组的遍历首先想到的是for()循 ...
- 前端小插件之手写js循环滚动特效
很多前端都离不开滚动的特效,调用插件繁琐,后期更改麻烦,考虑到这些因素,自己写了一套无限循环滚动的小特效. 首先滚动特效很好写,用css就可以完成,下面写一个基础css向上循环滚动特效 html &l ...
- 2019前端面试系列——JS高频手写代码题
实现 new 方法 /* * 1.创建一个空对象 * 2.链接到原型 * 3.绑定this值 * 4.返回新对象 */ // 第一种实现 function createNew() { let obj ...
- 常见的JS手写函数汇总(代码注释、持续更新)
最近在复习面试中常见的JS手写函数,顺便进行代码注释和总结,方便自己回顾也加深记,内容也会陆陆续续进行补充和改善. 一.手写深拷贝 <script> const obj1 = { name ...
- 原生html、js手写 radio与checkbox 美化
原生html.js手写 radio与checkbox 美化 html <!DOCTYPE html> <html> <head> <meta charse ...
- 几道JS代码手写面试题
几道JS代码手写面试题 (1) 高阶段函数实现AOP(面向切面编程) Function.prototype.before = function (beforefn) { let ...
随机推荐
- 九度OnlineJudge之1014:排名
题目描述: 今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑每题的分值,所以并不是最后的排名.给定录取分数线,请你写程序找出最后通过分数线的考生,并将他 ...
- spring AOP 是如何一步一步被简化的
Aop的配置使用 Aop的思想实现是基于代理设计模式的, 动态增加某些功能. 因此在最开始阶段 1 所有需要被织入的类都需要被代理(ProxyFactoryBean). 2 切面(advisor)的实 ...
- 用angularjs开发下一代web应用(二):angularjs应用骨架(二)
1.浅谈非入侵式JavaScript <div ng-click="doSomething()">...</div>这些指令和原来的事件处理器有下面不同之处 ...
- oracle至mysql该指南的数据模式()任意数据源之间的跨导应用
为了产生的一些资源的库的释放.需要API模块迁移到mysql在,需要引导数据. 试用oracle to mysql工具.当迁移错误不说,如此大量的数据的,有了这样简陋的工具是不太可靠. 意外的发现工具 ...
- Effective C++_笔记_条款07_为多态基类声明virtual析构函数
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 这个规则只适用于polymorphic(带多态性质的)base ...
- FZU 1894 (双端队列)
Problem 1894 志愿者选拔 Accept: 1166 Submit: 3683 Time Limit: 1500 mSec Memory Limit : 32768 KB Pr ...
- How to find configuration file MySQL uses?(转)
http://www.dbasquare.com/2012/04/01/how-to-find-mysql-configuration-file/ A customer called me today ...
- MongoDB学习笔记(三) 在MVC模式下通过Jqgrid表格操作MongoDB数据
看到下图,是通过Jqgrid实现表格数据的基本增删查改的操作.表格数据增删改是一般企业应用系统开发的常见功能,不过不同的是这个表格数据来源是非关系型的数据库MongoDB.nosql虽然概念新颖,但是 ...
- DELPHI SOKET 编程(使用TServerSocket和TClientSocket)
本文采用delphi7+TServerSocket+TClientSocket; 笔者在工作中遇到对局域网中各工作站与服务器之间进行Socket通信的问题.现在将本人总结出来的TServerSocke ...
- Git 图解剖析(转)
git中文件内容并没有真正存储在索引(.git/index)或者提交对象中,而是以blob的形式分别存储在数据库中(.git/objects),并用SHA-1值来校验. 索引文件用识别码列出相关的bl ...