Cocos2d-x使用Javascript开发js绑定C++<代码示例>

class IOSiAPDelegate{

    

public:

    virtual ~IOSiAPDelegate() {}

};


class IOSAlipay{

    

public:

    IOSAlipay();

    ~IOSAlipay();

    void iOSProductByIdentifier(std::string &identifier,std::string amount);

    IOSiAPDelegate *delegate;

};




#pragma mark-------------------------IOSAlipay的实现代理方法--------------------------------

IOSAlipay::IOSAlipay():delegate(nil){}

IOSAlipay::~IOSAlipay(){}

void IOSAlipay::iOSProductByIdentifier(std::string &identifier,std::string amount){

    NSLog(@"%s",__FUNCTION__);

    //将产品id存入缓存中

    CCUserDefault* config = CCUserDefault::sharedUserDefault();//先读

    config->setStringForKey ("productIdentifier" , identifier);//存入

    config->flush();//刷新一下

    config->setStringForKey("amount", amount);//将金额传入

    

}

#pragma mark-------------------------IOSAlipay的实现代理方法--------------------------------





#ifndef __iAP_JSBinding__IOSiAP_JSB__

#define __iAP_JSBinding__IOSiAP_JSB__


#include "jsapi.h"


void JSB_register_iOSAlipay(JSContext* cx, JSObject* obj);


#endif /* defined(__iAP_JSBinding__IOSiAP_JSB__) */






#include <stdio.h>


#include "IOSAlipay.h"

#include "ScriptingCore.h"


class IOSAlipay_Bridge : public IOSiAPDelegate

{

public:

    IOSAlipay_Bridge();

    ~IOSAlipay_Bridge();

    IOSAlipay *iap;

    JSObject *jsobj;

};


IOSAlipay_Bridge::IOSAlipay_Bridge(){

    iap = new IOSAlipay();

    iap->delegate = this;

}


IOSAlipay_Bridge::~IOSAlipay_Bridge(){

    delete iap;

}

static JSClass *JSB_IOSAlipay_class = NULL;

static JSObject *JSB_IOSAlipay_object = NULL;

#pragma mark-----绑定的析构函数

static void JSB_IOSAlipay_finalize(JSFreeOp *fop, JSObject *obj)

{

    IOSAlipay_Bridge *bridge = (IOSAlipay_Bridge *)JS_GetPrivate(obj);

    JS_SetPrivate(obj, NULL);

    delete bridge;

}

#pragma mark------初始化构造函数

static JSBool JSB_IOSAlipay_constructor(JSContext *cx, unsigned argc, JS::Value *vp)

{

    if (argc == 0) {

        JSObject *jsobj = JS_NewObject(cx, JSB_IOSAlipay_class, JSB_IOSAlipay_object, NULL);

        IOSAlipay_Bridge *bridge = new IOSAlipay_Bridge();

        bridge->jsobj = jsobj;

        JS_SetPrivate(jsobj, (void *)bridge);

        JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(jsobj));

        return JS_TRUE;

    }

    JS_ReportError(cx, "Wrong number of arguments: %d, was expecting: %d", argc, 0);

    return JS_FALSE;

}

#pragma mark------  该方法主要用于处理用于绑定到js中的方法,并接收js传递过来的参数

static JSBool JSB_IOSiAP_iOSProductByIdentifier(JSContext *cx, uint32_t argc, jsval *vp)

{

    JSB_PRECONDITION2(argc==2, cx, JS_FALSE, "Invalid number of arguments");

    jsval *argv = JS_ARGV(cx,vp);

    

    JSObject *obj = (JSObject *)JS_THIS_OBJECT(cx, vp);

    IOSAlipay_Bridge *bridge = (IOSAlipay_Bridge *)JS_GetPrivate(obj);

    

    // safety check for type

    if (JS_FALSE == JSVAL_IS_STRING(argv[0])) {

        JS_SET_RVAL(cx, vp, JSVAL_VOID);

        return JS_TRUE;

    }

    JSString *jsIdentifier = JSVAL_TO_STRING(argv[0]);//获取产品ID

    JSStringWrapper wrapper(jsIdentifier);

    std::string identifier = wrapper.get();

    JSString *jsPrice = JSVAL_TO_STRING(argv[1]);//获得价格

    JSStringWrapper pWrapper(jsPrice);

    std::string price = pWrapper.get();

    bridge->iap->iOSProductByIdentifier(identifier,price);//传入方法参数

    

    return JS_TRUE;

}

#pragma mark----------------------创建处理JS绑定对象类

static void JSB_IOSAlipay_createClass(JSContext *cx, JSObject* globalObj, const char* name)

{

JSB_IOSAlipay_class = (JSClass *)calloc(1, sizeof(JSClass));

    // 类型名称为 **IOSAlipay** 正式绑定到 js js 调用的名称

JSB_IOSAlipay_class->name = name;

JSB_IOSAlipay_class->addProperty = JS_PropertyStub;

JSB_IOSAlipay_class->delProperty = JS_PropertyStub;//JS_DeletePropertyStub;

JSB_IOSAlipay_class->getProperty = JS_PropertyStub;

JSB_IOSAlipay_class->setProperty = JS_StrictPropertyStub;

JSB_IOSAlipay_class->enumerate = JS_EnumerateStub;

JSB_IOSAlipay_class->resolve = JS_ResolveStub;

JSB_IOSAlipay_class->convert = JS_ConvertStub;

JSB_IOSAlipay_class->finalize = JSB_IOSAlipay_finalize;

JSB_IOSAlipay_class->flags = JSCLASS_HAS_PRIVATE;

//    JSCLASS_HAS_PRIVATE;   JSCLASS_HAS_RESERVED_SLOTS(2)

    // no property for this class

static JSPropertySpec properties[] = {

        {0, 0, 0, 0, 0}

};

    // 设定绑定函数,函数名 "iOSProductByIdentifier",绑定函数 "JSB_IOSiAP_iOSProductByIdentifier"

    // 后面可以添加其它函数绑定,如果需要,之后以 "JS_FS_END" 结尾

    // define member function

static JSFunctionSpec funcs[] = {

        JS_FN("iOSProductByIdentifier", JSB_IOSiAP_iOSProductByIdentifier,1, JSPROP_PERMANENT | JSPROP_ENUMERATE),

JS_FS_END

};

    // 这里定义并且绑定了静态函数(static),包括方法名 "create"和对应的绑定实现

static JSFunctionSpec st_funcs[] = {

JS_FS_END

};

JSB_IOSAlipay_object = JS_InitClass(

                                      cx,globalObj,

                                      NULL,

                                      JSB_IOSAlipay_class,

                                      JSB_IOSAlipay_constructor,0,//这里绑定的是构造函数的实现,也就是用js-new操作符创建的对象

                                      properties,

                                      funcs,// 函数绑定

                                      NULL,// no static properties

                                      st_funcs);// 静态函数绑定

}

#pragma mark ----注册绑定方法  JS 能够找到 所有类

/**

 *  该方法主要在 本程序中的 GameEnter.cpp中进行集体绑定

 *  sc->addRegisterCallback(JSB_register_iOSiAP);

 *

 *  @param cx  上下文

 *  @param obj 对象

 *  @return 返回值

 */

// extern init function

void JSB_register_iOSAlipay(JSContext* cx, JSObject* obj)

{

    // define name space

    JSObject *myBinding = JS_NewObject(cx, NULL, NULL, NULL);

    js::RootedValue myBindingVal(cx);

    myBindingVal = OBJECT_TO_JSVAL(myBinding);

JS_SetProperty(cx, obj, "MyBinding", (jsval *)&myBindingVal);

    // register class

    JSB_IOSAlipay_createClass(cx, myBinding, "IOSAlipay");

}













  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GFanStudio-LeeSir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值