js绑定的问题

JSObject *jsObj = (JSObject *)JS_THIS_OBJECT(cx, vp);
XObject *newObject = (XObject *)JS_GetPrivate(jsObj);

obj = JS_THIS_OBJECT(cx, vp);
js_proxy_t *proxy = jsb_get_js_proxy(obj);
cobj = (ls::Leafsoar *)(proxy ? proxy->ptr : NULL);

我现在看教程。有两种获取对像的方法。
可是我用第一种可以获取到。用第二种一直为空,

我想问一下。用第二种,需要怎么的设置。或是要求。因为我现在看到其它的绑定全都用第二个方法。
而且用第二种方法。那这个函数js_proxy_t * p = jsb_get_native_proxy(this);因该也起到作用的。

JSClass *js_cocos2dx_clientTcpSocket_class;
JSObject *js_cocos2dx_clientTcpSocket_prototype;

using namespace JSB;

bool js_JSB_ClientTcpSocket_connect(JSContext *cx, uint32_t argc, jsval *vp)
{
jsval *argv = JS_ARGV(cx, vp);
JSObject obj = JS_THIS_OBJECT(cx, vp);
CClientTcpSocket
cobj = (CClientTcpSocket *)JS_GetPrivate(obj);

if (argc == 2)
{
    if (JSVAL_IS_STRING(argv) && JSVAL_IS_INT(argv))
    {
        std::string data;
        jsval_to_std_string(cx, argv, &data);
        int port = JSVAL_TO_INT(argv);
        cobj->connect( data.c_str(), port );
        JS_SET_RVAL(cx, vp, JSVAL_VOID);
        return true;
    }
}
JS_ReportError(cx, "wrong number of arguments: %d, was expecting %d", argc, 0);
return false;

}

bool js_JSB_ClientTcpSocket_send(JSContext *cx, uint32_t argc, jsval *vp)
{
jsval *argv = JS_ARGV(cx, vp);
JSObject obj = JS_THIS_OBJECT(cx, vp);
CClientTcpSocket
cobj = (CClientTcpSocket *)JS_GetPrivate(obj);

if(argc == 1){
    do
    {
        if (argv.isObject())
        {
            uint8_t *bufdata = NULL;
            uint32_t len = 0;

            JSObject* jsobj = JSVAL_TO_OBJECT(argv);
            if (JS_IsArrayBufferObject(jsobj))
            {
                bufdata = JS_GetArrayBufferData(jsobj);
                len = JS_GetArrayBufferByteLength(jsobj);
            }
            else if (JS_IsArrayBufferViewObject(jsobj))
            {
                bufdata = (uint8_t*)JS_GetArrayBufferViewData(jsobj);
                len = JS_GetArrayBufferViewByteLength(jsobj);
            }

            if (bufdata && len > 0)
            {
                cobj->send(bufdata, len);
                break;
            }
        }

        JS_ReportError(cx, "data type to be sent is unsupported.");

    } while (0);

    JS_SET_RVAL(cx, vp, JSVAL_VOID);

    return true;
}
JS_ReportError(cx, "wrong number of arguments: %d, was expecting %d", argc, 0);
return true;

}

bool js_JSB_ClientTcpSocket_close(JSContext *cx, uint32_t argc, jsval *vp)
{
JSObject obj = JS_THIS_OBJECT(cx, vp);
CClientTcpSocket
cobj = (CClientTcpSocket *)JS_GetPrivate(obj);

if(argc == 0)
{
    cobj->close();
    JS_SET_RVAL(cx, vp, JSVAL_VOID);
    return true;
}
JS_ReportError(cx, "wrong number of arguments: %d, was expecting %d", argc, 0);
return false;

}

static void js_JSB_ClientTcpSocket_finalize(JSFreeOp *fop, JSObject *obj)
{
CCLOGINFO(“jsbindings: finalizing JS object %p (ClientTcpSocket)”, obj);
CClientTcpSocket *newObject = (CClientTcpSocket *)JS_GetPrivate(obj);
JS_SetPrivate(obj, NULL);
delete newObject;
}

bool js_JSB_ClientTcpSocket_constructor(JSContext *cx, uint32_t argc, jsval *vp)
{

JSObject *jsobj = JS_NewObject(cx, js_cocos2dx_clientTcpSocket_class, js_cocos2dx_clientTcpSocket_prototype, NULL);
CClientTcpSocket *newObject = new CClientTcpSocket();
newObject->init();
newObject->setJSDelegate( jsobj );
JS_SetPrivate(jsobj, (void *)newObject);
JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(jsobj));
return true;

}

static void js_JSB_ClientTcpSocket_createClass(JSContext *cx, JSObject *global) {

js_cocos2dx_clientTcpSocket_class = (JSClass *)calloc(1, sizeof(JSClass));
js_cocos2dx_clientTcpSocket_class->name = "ClientTcpSocket";
js_cocos2dx_clientTcpSocket_class->addProperty = JS_PropertyStub;
js_cocos2dx_clientTcpSocket_class->delProperty = JS_DeletePropertyStub;
js_cocos2dx_clientTcpSocket_class->getProperty = JS_PropertyStub;
js_cocos2dx_clientTcpSocket_class->setProperty = JS_StrictPropertyStub;
js_cocos2dx_clientTcpSocket_class->enumerate = JS_EnumerateStub;
js_cocos2dx_clientTcpSocket_class->resolve = JS_ResolveStub;
js_cocos2dx_clientTcpSocket_class->convert = JS_ConvertStub;
js_cocos2dx_clientTcpSocket_class->finalize = js_JSB_ClientTcpSocket_finalize;
js_cocos2dx_clientTcpSocket_class->flags = JSCLASS_HAS_RESERVED_SLOTS(2);

static JSPropertySpec properties] = {
    {0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER}
};

static JSFunctionSpec funcs] = {
    JS_FN("connect",    js_JSB_ClientTcpSocket_connect, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE),
    JS_FN("send",        js_JSB_ClientTcpSocket_send, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE),
    JS_FN("close",        js_JSB_ClientTcpSocket_close, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE),
    JS_FS_END
};

static JSFunctionSpec st_funcs] = {
    JS_FS_END
};


js_cocos2dx_clientTcpSocket_prototype = JS_InitClass(
    cx, global,
    NULL,
    js_cocos2dx_clientTcpSocket_class,
    js_JSB_ClientTcpSocket_constructor, 0, // constructor
    properties,
    funcs,
    NULL, // no static properties
    st_funcs);

}

void register_jsb_clientTcpSocket( JSContext* cx, JSObject* obj )
{
JS::RootedValue nsval(cx);
JS::RootedObject ns(cx);
JS_GetProperty(cx, obj, “JSB”, &nsval);
if (nsval == JSVAL_VOID) {
ns = JS_NewObject(cx, NULL, NULL, NULL);
nsval = OBJECT_TO_JSVAL(ns);
JS_SetProperty(cx, obj, “JSB”, nsval);
} else {
JS_ValueToObject(cx, nsval, &ns);
}
obj = ns;

js_JSB_ClientTcpSocket_createClass(cx,obj);

}

这是绑定的代码。
急求解,。。。。。

看下的构造函数里就知道了,你用JS_GetPrivate可以是因为你JS_SetPrivate了,这是给js对象设置一个你自己的私有数据的指针,用这种方式你还需要在finalize钩子函数里自己清理掉内存 https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/JSAPI_reference/JS_SetPrivate
jsb_get_js_proxy不行是因为你没有创建这一个proxy对象,使用jsb_new_proxy,具体方法看看自动引擎里自动生成的代码里constructor的写法

— Begin quote from ____

引用第2楼joshua_astray于2014-09-09 13:57发表的 :
看下的构造函数里就知道了,你用JS_GetPrivate可以是因为你JS_SetPrivate了,这是给js对象设置一个你自己的私有数据的指针,用这种方式你还需要在finalize钩子函数里自己清理掉内存 https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/JSAPI_reference/JS_SetPrivate
jsb_get_js_proxy不行是因为你没有创建这一个proxy对象,使用jsb_new_proxy,具体方法看看引擎里自动生成的代码里constructor的写法 http://www.cocoachina.com/bbs/job.php?action=topost&tid=227741&pid=1049079

— End quote

照着引擎里自动生成的constructor写,把类名神马的改一下应该就好了

好的。谢谢

官方的教程那个自动绑定。写的莫名其妙。怎么都不懂。只好手动了。