这两天连续查阅了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++的更多相关文章

  1. 手写js面向对象选项卡插件

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  2. 手写JS无缝滚动插件

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  3. vue10行代码实现上拉翻页加载更多数据,纯手写js实现下拉刷新上拉翻页不引用任何第三方插件

    vue10行代码实现上拉翻页加载更多数据,纯手写js实现下拉刷新上拉翻页不引用任何第三方插件/库 一提到移动端的下拉刷新上拉翻页,你可能就会想到iScroll插件,没错iScroll是一个高性能,资源 ...

  4. 手写js代码(一)javascript数组循环遍历之forEach

    注:原文地址http://blog.csdn.net/oscar999/article/details/8671546 我这里是仿照学习! 1.js的数组循环遍历 ①数组的遍历首先想到的是for()循 ...

  5. 前端小插件之手写js循环滚动特效

    很多前端都离不开滚动的特效,调用插件繁琐,后期更改麻烦,考虑到这些因素,自己写了一套无限循环滚动的小特效. 首先滚动特效很好写,用css就可以完成,下面写一个基础css向上循环滚动特效 html &l ...

  6. 2019前端面试系列——JS高频手写代码题

    实现 new 方法 /* * 1.创建一个空对象 * 2.链接到原型 * 3.绑定this值 * 4.返回新对象 */ // 第一种实现 function createNew() { let obj ...

  7. 常见的JS手写函数汇总(代码注释、持续更新)

    最近在复习面试中常见的JS手写函数,顺便进行代码注释和总结,方便自己回顾也加深记,内容也会陆陆续续进行补充和改善. 一.手写深拷贝 <script> const obj1 = { name ...

  8. 原生html、js手写 radio与checkbox 美化

    原生html.js手写 radio与checkbox   美化 html <!DOCTYPE html> <html> <head> <meta charse ...

  9. 几道JS代码手写面试题

    几道JS代码手写面试题   (1) 高阶段函数实现AOP(面向切面编程)    Function.prototype.before = function (beforefn) {        let ...

随机推荐

  1. FreeLink开源呼叫中心设计思想

    上一篇大概说了国内外优秀的呼叫中心系统: 国内外优秀呼叫中心系统简单介绍 借鉴上述呼叫中心系统,我们的设计新一代呼叫中心例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY ...

  2. Python中的列表解析和生成表达式

    摘要:优雅.清晰和务实都是python的核心价值观,如果想通过操作和处理一个序列(或其他的可迭代对象)来创建一个新的列表时可以使用列表解析( List comprehensions)和生成表达式,通过 ...

  3. <转载>CSS解决图片过大撑破DIV的方法

    DIV+CSS网页内容中如果插入大于DIV层宽度显示,过大的图片将会撑破网页宽度显示从而网页严重变形,您是否遇到过?这里DIVCSS5给大家介绍几种解决图片撑破撑开网页DIV层方法. 图片撑破宽度解决 ...

  4. 14.1.1 InnoDB as the Default MySQL Storage Engine

    14.1 Introduction to InnoDB 14.1.1 InnoDB as the Default MySQL Storage Engine 14.1.2 Checking InnoDB ...

  5. quarze的工作原理

    quartz的工作原理 http://lavasoft.blog.51cto.com/62575/181907/ 几种定时任务的比較 http://blog.sina.com.cn/s/blog_69 ...

  6. 数据字典的QUAN DEC类型与ABAP P型转换

    转至:http://sap.iteye.com/blog/121584   今天突然想到的,肯定很多人知道,但是也肯定有一大堆人不知道. 转换公式 (n+1)/2 比如DEC定义为13位,其中3位小数 ...

  7. vscode编写插件

    vscode编写插件详细过程 前言 之前编写了一个vscode插件用vscode写博客和发布,然后有园友要求写一篇来介绍如何开发一个vscode扩展插件,或者说介绍开发这个插件的过程.然而文章还没有写 ...

  8. HP-UX查看版本

    首先采用uname -a查看服务器类型 $ uname -a    HP-UX WEBDB1 B.11.31 U ia64 0749665296 unlimited-user license 服务器的 ...

  9. J2EE开发框架搭建(2) - springmvc4 + spring4 + hibernate4 整合

    1. 打开hqhop-framework-parent项目下的pom.xml文件.加入springmvc4 , spring4 , hibernate4 ,以及数据源druid的依赖包,插件,依赖包版 ...

  10. Oauth认证的时候报错:timestamp_refused

    今天server大规模报错,大部分用户无法登陆,小部分能够登陆,非常是奇怪. 查看log.调试代码,发现问题是在oauth认证的时候出了问题,报 timestamp_refused. google了下 ...