ios中调用lua函数及传参方法
CCScriptEngineProtocol* pEngine = CCLuaEngine::engine(); CCScriptEngineManager::sharedManager()->setScriptEngine(pEngine); string path = CCFileUtils::sharedFileUtils()->fullPathFromRelativePath("hello.lua"); pEngine->addSearchPath(path.substr(0, path.find_last_of("/")).c_str()); pEngine->executeScriptFile(path.c_str()); lua_State* state = pEngine->getLuaState(); lua_getglobal(state,"myadd"); //查找lua_add函数,并压入栈底 pEngine->pushFloatToLuaStack(3); //函数参数1 pEngine->pushFloatToLuaStack(4); //函数参数12 lua_pcall(state,2,1,0); //调用myadd函数,同时会对myadd及两个参加进行出栈操作,并压入返回值 int result = lua_tointeger(state,-1);//从栈中取回返回值 lua_pop(state,1);//清栈,由于当前只有一个返回值 CCLog("result = %d",result);
lua代码:
function myadd(x, y) print(os.date()) return x + y end
Mon Aug 6 10:51:26 2012 Cocos2d: result = 7
lua调用C++方法:
lua_getglobal(state,"lua_add"); //查找lua_add函数,并压入栈底 lua_register(state,"add",add);
int add(lua_State* L) { CCLog("************add**********"); int a = lua_tointeger(L,1);//取得函数参数 int b = lua_tointeger(L,2); lua_pushinteger(L,a+b);//入栈返回值 return 1;//1表示压入栈数据个数 }
function lua_add(a,b)
return add(a,b)
end
输出结果:
Cocos2d: ************add********** Cocos2d: result = 7
void lua_call (lua_State *L, int nargs, int nresults);
调用一个函数。
要调用一个函数请遵循以下协议: 首先,要调用的函数应该被压入堆栈; 接着,把需要传递给这个函数的参数按正序压栈; 这是指第一个参数首先压栈。 最后调用一下lua_call
; nargs
是你压入堆栈的参数个数。 当函数调用完毕后,所有的参数以及函数本身都会出栈。 而函数的返回值这时则被压入堆栈。 返回值的个数将被调整为nresults
个, 除非 nresults
被设置成 LUA_MULTRET
。 在这种情况下,所有的返回值都被压入堆栈中。 Lua 会保证返回值都放入栈空间中。 函数返回值将按正序压栈(第一个返回值首先压栈), 因此在调用结束后,最后一个返回值将被放在栈顶。
void lua_pushnumber (lua_State *L, lua_Number n);
把一个数字 n
压栈。
lua_Integer lua_tointeger (lua_State *L, int idx);
把给定索引处的 Lua 值转换为 lua_Integer
这样一个有符号整数类型。 这个 Lua 值必须是一个数字或是一个可以转换为数字的字符串 (参见 §2.2.1); 否则,lua_tointeger
返回 0 。
如果数字不是一个整数, 截断小数部分的方式没有被明确定义。
void lua_pop (lua_State *L, int n);
从堆栈中弹出 n
个元素。