@pandamicro
Thank you for your reply.
jsb_cocos2dx_extension.hpp
extern JSClass *jsb_cocos2d_ImagePicker_class;
extern JSObject *jsb_cocos2d_ImagePicker_prototype;
bool js_cocos2dx_extension_ImagePicker_constructor(JSContext *cx, uint32_t argc, jsval *vp);
void js_cocos2dx_extension_ImagePicker_finalize(JSContext *cx, JSObject *obj);
void js_register_cocos2dx_extension_ImagePicker(JSContext *cx, JS::HandleObject global);
void register_all_cocos2dx_extension(JSContext* cx, JS::HandleObject obj);
bool js_cocos2dx_extension_ImagePicker_pickImage(JSContext *cx, uint32_t argc, jsval *vp);
bool js_cocos2dx_extension_ImagePicker_finishImage(JSContext *cx, uint32_t argc, jsval *vp);
bool js_cocos2dx_extension_ImagePicker_didFinishPickingWithResult(JSContext *cx, uint32_t argc, jsval *vp);
bool js_cocos2dx_extension_ImagePicker_getInstance(JSContext *cx, uint32_t argc, jsval *vp);
bool js_cocos2dx_extension_ImagePicker_ImagePicker(JSContext *cx, uint32_t argc, jsval *vp);
jsb_cocos2dx_extension.cpp
JSClass *jsb_cocos2d_ImagePicker_class;
JSObject *jsb_cocos2d_ImagePicker_prototype;
bool js_cocos2dx_extension_ImagePicker_pickImage(JSContext *cx, uint32_t argc, jsval *vp)
{
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
JS::RootedObject obj(cx, args.thisv().toObjectOrNull());
js_proxy_t *proxy = jsb_get_js_proxy(obj);
cocos2d::ImagePicker* cobj = (cocos2d::ImagePicker *)(proxy ? proxy->ptr : NULL);
JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_extension_ImagePicker_pickImage : Invalid Native Object");
if (argc == 0) {
cobj->pickImage();
args.rval().setUndefined();
return true;
}
JS_ReportError(cx, "js_cocos2dx_extension_ImagePicker_pickImage : wrong number of arguments: %d, was expecting %d", argc, 0);
return false;
}
bool js_cocos2dx_extension_ImagePicker_finishImage(JSContext *cx, uint32_t argc, jsval *vp)
{
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
bool ok = true;
JS::RootedObject obj(cx, args.thisv().toObjectOrNull());
js_proxy_t *proxy = jsb_get_js_proxy(obj);
cocos2d::ImagePicker* cobj = (cocos2d::ImagePicker *)(proxy ? proxy->ptr : NULL);
JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_extension_ImagePicker_finishImage : Invalid Native Object");
if (argc == 2) {
cocos2d::Texture2D* arg0 = nullptr;
std::string arg1;
do {
if (args.get(0).isNull()) { arg0 = nullptr; break; }
if (!args.get(0).isObject()) { ok = false; break; }
js_proxy_t *jsProxy;
JS::RootedObject tmpObj(cx, args.get(0).toObjectOrNull());
jsProxy = jsb_get_js_proxy(tmpObj);
arg0 = (cocos2d::Texture2D*)(jsProxy ? jsProxy->ptr : NULL);
JSB_PRECONDITION2( arg0, cx, false, "Invalid Native Object");
} while (0);
ok &= jsval_to_std_string(cx, args.get(1), &arg1);
JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_extension_ImagePicker_finishImage : Error processing arguments");
cobj->finishImage(arg0, arg1);
args.rval().setUndefined();
return true;
}
JS_ReportError(cx, "js_cocos2dx_extension_ImagePicker_finishImage : wrong number of arguments: %d, was expecting %d", argc, 2);
return false;
}
bool js_cocos2dx_extension_ImagePicker_didFinishPickingWithResult(JSContext *cx, uint32_t argc, jsval *vp)
{
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
bool ok = true;
JS::RootedObject obj(cx, args.thisv().toObjectOrNull());
js_proxy_t *proxy = jsb_get_js_proxy(obj);
cocos2d::ImagePicker* cobj = (cocos2d::ImagePicker *)(proxy ? proxy->ptr : NULL);
JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_extension_ImagePicker_didFinishPickingWithResult : Invalid Native Object");
if (argc == 1) {
std::function<void (cocos2d::Texture2D *, std::basic_string<char>)> arg0;
do {
if(JS_TypeOfValue(cx, args.get(0)) == JSTYPE_FUNCTION)
{
JS::RootedObject jstarget(cx, args.thisv().toObjectOrNull());
std::shared_ptr<JSFunctionWrapper> func(new JSFunctionWrapper(cx, jstarget, args.get(0), args.thisv()));
auto lambda = [=](cocos2d::Texture2D* larg0, std::basic_string<char> larg1) -> void {
JSB_AUTOCOMPARTMENT_WITH_GLOBAL_OBJCET
jsval largv[2];
if (larg0) {
largv[0] = OBJECT_TO_JSVAL(js_get_or_create_jsobject<cocos2d::Texture2D>(cx, (cocos2d::Texture2D*)larg0));
} else {
largv[0] = JSVAL_NULL;
};
largv[1] = std_string_to_jsval(cx, larg1);
JS::RootedValue rval(cx);
bool succeed = func->invoke(2, &largv[0], &rval);
if (!succeed && JS_IsExceptionPending(cx)) {
JS_ReportPendingException(cx);
}
};
arg0 = lambda;
}
else
{
arg0 = nullptr;
}
} while(0)
;
JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_extension_ImagePicker_didFinishPickingWithResult : Error processing arguments");
cobj->didFinishPickingWithResult(arg0);
args.rval().setUndefined();
return true;
}
JS_ReportError(cx, "js_cocos2dx_extension_ImagePicker_didFinishPickingWithResult : wrong number of arguments: %d, was expecting %d", argc, 1);
return false;
}
bool js_cocos2dx_extension_ImagePicker_getInstance(JSContext *cx, uint32_t argc, jsval *vp)
{
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
if (argc == 0) {
cocos2d::ImagePicker* ret = cocos2d::ImagePicker::getInstance();
jsval jsret = JSVAL_NULL;
if (ret) {
jsret = OBJECT_TO_JSVAL(js_get_or_create_jsobject<cocos2d::ImagePicker>(cx, (cocos2d::ImagePicker*)ret));
} else {
jsret = JSVAL_NULL;
};
args.rval().set(jsret);
return true;
}
JS_ReportError(cx, "js_cocos2dx_extension_ImagePicker_getInstance : wrong number of arguments");
return false;
}
bool js_cocos2dx_extension_ImagePicker_constructor(JSContext *cx, uint32_t argc, jsval *vp)
{
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
bool ok = true;
cocos2d::ImagePicker* cobj = new (std::nothrow) cocos2d::ImagePicker();
js_type_class_t *typeClass = js_get_type_from_native<cocos2d::ImagePicker>(cobj);
// link the native object with the javascript object
JS::RootedObject jsobj(cx, jsb_create_weak_jsobject(cx, cobj, typeClass, "cocos2d::ImagePicker"));
args.rval().set(OBJECT_TO_JSVAL(jsobj));
if (JS_HasProperty(cx, jsobj, "_ctor", &ok) && ok)
ScriptingCore::getInstance()->executeFunctionWithOwner(OBJECT_TO_JSVAL(jsobj), "_ctor", args);
return true;
}
void js_cocos2d_ImagePicker_finalize(JSFreeOp *fop, JSObject *obj) {
CCLOGINFO("jsbindings: finalizing JS object %p (ImagePicker)", obj);
js_proxy_t* nproxy;
js_proxy_t* jsproxy;
JSContext *cx = ScriptingCore::getInstance()->getGlobalContext();
JS::RootedObject jsobj(cx, obj);
jsproxy = jsb_get_js_proxy(jsobj);
if (jsproxy) {
cocos2d::ImagePicker *nobj = static_cast<cocos2d::ImagePicker *>(jsproxy->ptr);
nproxy = jsb_get_native_proxy(jsproxy->ptr);
if (nobj) {
jsb_remove_proxy(nproxy, jsproxy);
delete nobj;
}
else
jsb_remove_proxy(nullptr, jsproxy);
}
}
void js_register_cocos2dx_extension_ImagePicker(JSContext *cx, JS::HandleObject global) {
jsb_cocos2d_ImagePicker_class = (JSClass *)calloc(1, sizeof(JSClass));
jsb_cocos2d_ImagePicker_class->name = "ImagePicker";
jsb_cocos2d_ImagePicker_class->addProperty = JS_PropertyStub;
jsb_cocos2d_ImagePicker_class->delProperty = JS_DeletePropertyStub;
jsb_cocos2d_ImagePicker_class->getProperty = JS_PropertyStub;
jsb_cocos2d_ImagePicker_class->setProperty = JS_StrictPropertyStub;
jsb_cocos2d_ImagePicker_class->enumerate = JS_EnumerateStub;
jsb_cocos2d_ImagePicker_class->resolve = JS_ResolveStub;
jsb_cocos2d_ImagePicker_class->convert = JS_ConvertStub;
jsb_cocos2d_ImagePicker_class->finalize = js_cocos2d_ImagePicker_finalize;
jsb_cocos2d_ImagePicker_class->flags = JSCLASS_HAS_RESERVED_SLOTS(2);
static JSPropertySpec properties[] = {
JS_PS_END
};
static JSFunctionSpec funcs[] = {
JS_FN("pickImage", js_cocos2dx_extension_ImagePicker_pickImage, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE),
JS_FN("finishImage", js_cocos2dx_extension_ImagePicker_finishImage, 2, JSPROP_PERMANENT | JSPROP_ENUMERATE),
JS_FN("didFinishPickingWithResult", js_cocos2dx_extension_ImagePicker_didFinishPickingWithResult, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE),
JS_FS_END
};
static JSFunctionSpec st_funcs[] = {
JS_FN("getInstance", js_cocos2dx_extension_ImagePicker_getInstance, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE),
JS_FS_END
};
jsb_cocos2d_ImagePicker_prototype = JS_InitClass(
cx, global,
JS::NullPtr(),
jsb_cocos2d_ImagePicker_class,
js_cocos2dx_extension_ImagePicker_constructor, 0, // constructor
properties,
funcs,
NULL, // no static properties
st_funcs);
JS::RootedObject proto(cx, jsb_cocos2d_ImagePicker_prototype);
JS::RootedValue className(cx, std_string_to_jsval(cx, "ImagePicker"));
JS_SetProperty(cx, proto, "_className", className);
JS_SetProperty(cx, proto, "__nativeObj", JS::TrueHandleValue);
JS_SetProperty(cx, proto, "__is_ref", JS::FalseHandleValue);
// add the proto and JSClass to the type->js info hash table
jsb_register_class<cocos2d::ImagePicker>(cx, jsb_cocos2d_ImagePicker_class, proto, JS::NullPtr());
}