nsresult dpoCContext::CreateAlignedTA(uint type, size_t length, JSObject **res, JSContext *cx) { JSObject *buffer; uintptr_t offset; switch (type) { case js::ArrayBufferView::TYPE_FLOAT64: buffer = JS_NewArrayBuffer(cx, sizeof(double)*length+alignment_size); offset = (uintptr_t) JS_GetArrayBufferData(buffer, cx); offset = (offset + alignment_size) / alignment_size * alignment_size - offset; *res = JS_NewFloat64ArrayWithBuffer(cx, buffer, offset, length); break; case js::ArrayBufferView::TYPE_FLOAT32: buffer = JS_NewArrayBuffer(cx, sizeof(float)*length+alignment_size); offset = (uintptr_t) JS_GetArrayBufferData(buffer, cx); offset = (offset + alignment_size) / alignment_size * alignment_size - offset; *res = JS_NewFloat32ArrayWithBuffer(cx, buffer, offset, length); break; default: /* we only return float our double arrays, so fail in all other cases */ return NS_ERROR_NOT_IMPLEMENTED; } return NS_OK; }
bool DeserializeArrayBuffer(JS::Handle<JSObject*> aObj, const InfallibleTArray<uint8_t>& aBuffer, JS::MutableHandle<JS::Value> aVal) { mozilla::AutoSafeJSContext cx; JSAutoCompartment ac(cx, aObj); JS::Rooted<JSObject*> obj(cx, JS_NewArrayBuffer(cx, aBuffer.Length())); if (!obj) return false; uint8_t* data = JS_GetArrayBufferData(obj); if (!data) return false; memcpy(data, aBuffer.Elements(), aBuffer.Length()); aVal.set(OBJECT_TO_JSVAL(obj)); return true; }
bool AppDelegate::applicationDidFinishLaunching() { // initialize director auto director = Director::getInstance(); auto glview = director->getOpenGLView(); if(!glview) { #if(CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) glview = cocos2d::GLViewImpl::create("CocosProtobuf"); #else glview = cocos2d::GLViewImpl::createWithRect("CocosProtobuf", Rect(0,0,960,640)); #endif director->setOpenGLView(glview); } // set FPS. the default value is 1.0/60 if you don't call this director->setAnimationInterval(1.0 / 60); ScriptingCore* sc = ScriptingCore::getInstance(); sc->addRegisterCallback(register_all_cocos2dx); sc->addRegisterCallback(register_cocos2dx_js_core); sc->start(); sc->runScript("script/jsb_boot.js"); ScriptEngineProtocol *engine = ScriptingCore::getInstance(); ScriptEngineManager::getInstance()->setScriptEngine(engine); ScriptingCore::getInstance()->runScript("main.js"); // test send protobuf message from C++ JSObject* pGlobalObject = ScriptingCore::getInstance()->getGlobalObject(); JSContext* pGlobalContext = ScriptingCore::getInstance()->getGlobalContext(); // Create a GameInfo object first game::info::GameInfo gameInfo; // add RoleInfo object to repeated field game::info::RoleInfo *pRoleInfo1 = gameInfo.add_roleinfo(); pRoleInfo1->set_name("cpp_name1"); pRoleInfo1->set_type(game::enumeration::FIGHTER); // add another RoleInfo object to repeated field game::info::RoleInfo *pRoleInfo2 = gameInfo.add_roleinfo(); pRoleInfo2->set_name("cpp_name2"); pRoleInfo2->set_type(game::enumeration::BOWMAN); // add ItemInfo object to repeated field game::info::ItemInfo *pItemInfo1 = gameInfo.add_iteminfo(); pItemInfo1->set_name("cpp_item1"); pItemInfo1->set_price(100); // add another ItemInfo object to repeated field game::info::ItemInfo *pItemInfo2 = gameInfo.add_iteminfo(); pItemInfo2->set_name("cpp_item2"); pItemInfo2->set_price(200); std::string gameInfoString; gameInfo.SerializeToString(&gameInfoString); // need this before JS_NewArrayBuffer JSAutoCompartment ac(pGlobalContext, pGlobalObject); int length = gameInfoString.length(); JSObject* pMessageJSObject = JS_NewArrayBuffer(pGlobalContext, length); uint8_t* pMessageData = JS_GetArrayBufferData(pMessageJSObject); memcpy((void*)pMessageData, (const void*)gameInfoString.c_str(), gameInfoString.length()); JS::RootedValue ret(pGlobalContext); jsval arg = OBJECT_TO_JSVAL(pMessageJSObject); ScriptingCore::getInstance()->executeFunctionWithOwner(OBJECT_TO_JSVAL(pGlobalObject), "test_protobuf", 1, &arg, &ret); // game::info::GameInfo* pGameInfo = new game::info::GameInfo; JSObject* pRetJSObject = ret.toObjectOrNull(); if(pRetJSObject && JS_IsArrayBufferObject(pRetJSObject)) { uint8_t* pDataBuffer = nullptr; int dataBufferCount = 0; pDataBuffer = JS_GetArrayBufferData(pRetJSObject); dataBufferCount = JS_GetArrayBufferByteLength(pRetJSObject); pGameInfo->ParseFromArray(pDataBuffer, dataBufferCount); // RoleInfo Array for (int i = 0; i < pGameInfo->roleinfo_size(); i++) { // role info game::info::RoleInfo roleInfo = pGameInfo->roleinfo(i); CCLOG("roleInfo: \n%s\n", roleInfo.Utf8DebugString().c_str()); } // ItemInfo Array for (int i = 0; i < pGameInfo->iteminfo_size(); i++) { // role info game::info::ItemInfo itemInfo = pGameInfo->iteminfo(i); CCLOG("itemInfo: \n%s\n", itemInfo.Utf8DebugString().c_str()); } } return true; }