技术领域:
LuaBinding
出现错误的代码(lua):
local paths={}
cc.FileUtil:getInstance():listFilesRecursively(dirName,paths)
原因分析:
[[FileUtils::listFilesRecursively]]函数的第二个参数为 [[std::vectorstd::string *files]]
在lua_cocos2dx_auto.cpp中的lua_cocos2dx_FileUtils_listFilesRecursively 函数中,定义了FileUtils::listFilesRecursively到lua端的绑定方法。
在lua_cocos2dx_FileUtils_listFilesRecursively 函数内,试图将一个lua对象转换为一个std::vectorstd::string对象:
auto ok &= luaval_to_object<std::vector<std::basic_string, std::allocator<std::basic_string > >>(tolua_S, 3, “std::vector<std::basic_string, std::allocator<std::basic_string > >*”,&arg1, “cc.FileUtils:listFilesRecursively”);
或许可行的解决方案:
把[[FileUtils::listFilesRecursively]]函数放到manual中手动绑定到lua端,
并将[[lua_cocos2dx_FileUtils_listFilesRecursively]]函数源代码改为
int lua_cocos2dx_FileUtils_listFilesRecursively(lua_State* tolua_S)
{
int argc = 0;
cocos2d::FileUtils* cobj = nullptr;
bool ok = true;
#if COCOS2D_DEBUG >= 1
tolua_Error tolua_err;
#endif
#if COCOS2D_DEBUG >= 1
if (!tolua_isusertype(tolua_S,1,“cc.FileUtils”,0,&tolua_err)) goto tolua_lerror;
#endif
cobj = (cocos2d::FileUtils*)tolua_tousertype(tolua_S,1,0);
#if COCOS2D_DEBUG >= 1
if (!cobj)
{
tolua_error(tolua_S,“invalid ‘cobj’ in function ‘lua_cocos2dx_FileUtils_listFilesRecursively’”, nullptr);
return 0;
}
#endif
argc = lua_gettop(tolua_S)-1;
if (argc == 1)
{
std::string arg0;
std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > arg1;
ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.FileUtils:listFilesRecursively");
if(!ok)
{
tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FileUtils_listFilesRecursively'", nullptr);
return 0;
}
cobj->listFilesRecursively(arg0, &arg1);
ccvector_std_string_to_luaval(tolua_S, arg1);
return 1;
}
luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FileUtils:listFilesRecursively",argc, 2);
return 0;
#if COCOS2D_DEBUG >= 1
tolua_lerror:
tolua_error(tolua_S,"#ferror in function ‘lua_cocos2dx_FileUtils_listFilesRecursively’.",&tolua_err);
#endif
return 0;
}
使用版本cocos2dx -3.15