1. 程式人生 > >cocos2d-js-v3.0-rc2:js繫結呼叫c++函式 1

cocos2d-js-v3.0-rc2:js繫結呼叫c++函式 1

分享一種簡單的js呼叫c++程式碼的繫結方法、

首先用c++寫一個方法,為了簡便就在CCSprite裡面寫個一個sumTwonum(兩個數相加)

在CCSprite.h裡新增

public:
    int sumTwonum(int a,int b);

在CCSprite.cpp裡新增

int Sprite::sumTwonum(int a,int b){
    return a+b;
}

接著就是jsb裡面繫結這個函式

在jsb_cocos2dx_auto.hpp裡新增

bool js_cocos2dx_Sprite_sumTwonum(JSContext *cx, uint32_t argc, jsval *vp);

在jsb_cocos2dx_auto.cpp裡新增

bool js_cocos2dx_Sprite_sumTwonum(JSContext *cx, uint32_t argc, jsval *vp)
{
jsval *argv = JS_ARGV(cx, vp);
bool ok = true;


JSObject *obj = JS_THIS_OBJECT(cx, vp);
js_proxy_t *proxy = jsb_get_js_proxy(obj);
cocos2d::Sprite* cobj = (cocos2d::Sprite *)(proxy ? proxy->ptr : NULL);
JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_Sprite_getOffsetPosition : Invalid Native Object");
if (argc == 2) {
int arg0;
int arg1;
do {
ok &= jsval_to_int32(cx, argv[0], (int32_t *)&arg0);
ok &= jsval_to_int32(cx, argv[1], (int32_t *)&arg1);
JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_Event_constructor : Error processing arguments");
}while(0);


const int ret = cobj->sumTwonum(arg0,arg1);
jsval jsret = JSVAL_NULL;
jsret = int32_to_jsval(cx, ret);
JS_SET_RVAL(cx, vp, jsret);
return true;
}
return false;
}

在這個cpp裡找到static JSFunctionSpec funcs[] ,這個數組裡面新增一條如下一條資料

        JS_FN("sumTwonum", js_cocos2dx_Sprite_sumTwonum, 2, JSPROP_PERMANENT | JSPROP_ENUMERATE),

這樣就好了,用js可以直接呼叫,程式碼如下:

cc.log("bounding Success"+this.sprite.sumTwonum(1,1));

輸出的結果是:

JS: bounding Success2