今天项目中要在lua中调用有返回值的c++函数,对于这方面从来没用做过,所以就开始各种照猫画虎~~~~
找到了audio.lua。看到了function audio.playMusic(filename, isLoop)方法。
修改sharedEngine:playMusic( filename, isLoop)成sharedEngine:playMusic( DCConfigParams.helperFind(filename), isLoop)
打开DCConfigParams.lua,添加如下代码:
-- 读取文件 function DCConfigParams.helperFind(str) return DCLuaConfigParams:helperFind(str) end
找到项目中DataEye.cpp
找到了这个地方:
tolua_cclass(tolua_S, "DCLuaConfigParams", "DCLuaConfigParams", "", NULL); tolua_beginmodule(tolua_S, "DCLuaConfigParams"); tolua_function(tolua_S, "update", tolua_DataEye_DCConfigParams_update00); tolua_function(tolua_S, "getParameter", tolua_DataEye_DCConfigParams_getParameter00); tolua_function(tolua_S, "getParameter", tolua_DataEye_DCConfigParams_getParameter01); tolua_function(tolua_S, "getParameter", tolua_DataEye_DCConfigParams_getParameter02);
在下面添加:
// 解密
tolua_function(tolua_S, "helperFind", tolua_DataEye_DCConfigParams_helperFind03);
如图:
其实我自己是照着“tolua_function(tolua_S, "getParameter", tolua_DataEye_DCConfigParams_getParameter02)”方法去写的
接下来,坑来了,复制了tolua_DataEye_DCConfigParams_getParameter02的实现方法,修改后如下:
/* method: helperFind of class DCLuaConfigParams */ #ifndef TOLUA_DISABLE_tolua_DataEye_DCConfigParams_helperFind03 static int tolua_DataEye_DCConfigParams_helperFind03(lua_State* tolua_S) { #ifndef TOLUA_RELEASE tolua_Error tolua_err; if ( !tolua_isusertable(tolua_S,1,"DCLuaConfigParams",0,&tolua_err) ||
!tolua_isnoobj(tolua_S,2,&tolua_err) ) goto tolua_lerror; else
#endif { { const char *key = ((const char*) tolua_tostring(tolua_S,2,0)); tolua_pushstring(tolua_S, Nato::Find(key)); } } return 0; #ifndef TOLUA_RELEASE tolua_lerror: tolua_error(tolua_S,"#ferror in function 'helperFind'.",&tolua_err); return 0; #endif } #endif //#ifndef TOLUA_DISABLE
运行的时候,lua调用到c++的方法了,可是lua就是接受不到Nato::Find(key)返回的值。 自个本事是菜鸟,所以就自己做各种打印测试,结果就是接受不到值,可是别的方法怎么就可以呢。
后面在网上找解决办法,没有相关的 , 然后我就去找了别人是怎么调用的。后来才发现了问题。一个很小的地方,如下图:
原来是你往tolua_S里面放入几个值,下面的return就必须是几!!!后面改成return后,果断可以了....