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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值