请问c++中怎样回调lua函数,我用的是cocos3.2版本

现在在做http通信这块,因为加密的原因,lua中有些运算不支持,就没用那个cocos自带的xmlhttprequest,自己写了一个c++类进行http通信,现在是c++这边怎样把响应数据传回给lua卡壳了,这块不知道怎么搞了。查了资料也没找到,请大牛请点一下。非常感谢

同问啊。你解决了没有?

— Begin quote from ____

引用第1楼cxl9074于2014-12-10 18:00发表的 :
同问啊。你解决了没有? http://www.cocoachina.com/bbs/job.php?action=topost&tid=233607&pid=1195230

— End quote

可通过ScriptHandlerMgr类进行C++与LUA的互调
这有个例子可参考下:
http://blog.sina.com.cn/s/blog_93add5520101lv02.html

这个帖子我也看了的。就是相对2.x版本而言,觉得3.0这样反而复杂了一点。
我本来的代码是2.x版本的,现在用3.0来重新写一遍。但就发现导出的C++类中要回调lua的函数就出现问题了。
本来2.x就传一个lua的函数进去,在C++中就是一个int的句柄了。没想到3.0之后的还要这么搞。

3.0不用这样做。
首先把cocos\scripting\lua-bindings\proj.win32目录下的libluacocos2d导入进来,vs2012里需要添加引用(3.0以后的C++工程创建时不自带这个目录,需要到引擎当中拷贝一份进来,cocos2d\external\lua这个目录也要拷贝进来)
然后自己封装一个调取lua全局函数
类似下面,下面用了boost,只是举例,不喜可换
首先
#include “CCLuaEngine.h”
c++初始化程序当中,需要初始化lua脚本引擎
ScriptEngineManager::getInstance()->setScriptEngine(LuaEngine::getInstance());
auto L = LuaEngine::getInstance()->getLuaStack()->getLuaState();
lua_module_register(L);
lua_register(L,“lua调用的方法名字”,方法); //注册自定义方法到lua当中去,以便lua调用,没有可忽略
if (LuaEngine::getInstance()->executeScriptFile(“lua/主lua.lua”)) { //此处的lua目录我是设置在Resources目录下,默认也是这里
log(“失败”);
} else {
log(“成功”);
LuaEngine::getInstance()->executeGlobalFunction(“init”); //初始化你的主方法,没有可忽略
}
//-------------上边的初始化一次即可
//-------------下边的是调用lua方法的代码,静态随时使,封装的不好,自己修改,只提供思路。快速回复没排版见谅
bool 随便::CallLuaFunction(lua_State *L, const char *szFuncName, object pIn)
{
if (szFuncName == NULL)
{
return false;
}

lua_getglobal(L, szFuncName);
int nInNum = pIn.size();
map<string, boost::any> pData;
object vData;
for (int i = 0; i < nInNum; i++)
{
    if(pIn*.type() == typeid(map<string, boost::any>)) {  //map类型传递
  //暂时省略,自己可封装个lua_pushtable
    } else if(pIn*.type() == typeid(object)) { //数组类型传递object == typedef vector<boost::any> object
         //暂时省略,自己可封装个lua_pushtable
    } else if(pIn*.type() == typeid(int)) { //int类型
        lua_pushnumber(L, boost::any_cast<int>(pIn*));
    } else if(pIn*.type() == typeid(string)) { //string类型
        lua_pushstring(L, boost::any_cast<string>(pIn*).c_str());
    } else if(pIn*.type() == typeid(bool)) { //逻辑判断类型,以上类型应该足够了
        lua_pushboolean(L, boost::any_cast<bool>(pIn*));
    }
}
int nStatus = lua_pcall(L, nInNum, 0, 0);
if (nStatus != 0)
{
    cocos2d::log("Runtime Error");
    return false;
}
return true;

}
//---------------------写好以后把静态类包含到应用当中使用时是这样
object param;
int param1 = 1;//第1个传递参数是int
param.push_back(param1);
string param2;//第2个传递参数是string
param2 = “nihao”;
param.push_back(param2);

bool doit = 随便::CallLuaFunction(L, “lua_func”, param); //lua_func是lua全局方法名称
if(!doit) {
log(“lua 调用失败”);
}
//-------------------------------------------------下边就是lua的简单写法,3.2没使过,3.1.1之前主lua需引用下面的,文件具体路径最后说
require “Cocos2d”
require “Cocos2dConstants”
//require “cocos.init” 3.2以后的是包含这句,文件具体路径最后说
function lua_func(param1, param2) //参数可以用动态变量代替,使“…”
cclog(“chenggongleme?”…param1…":"…param2)
end
//-----------------------------------下面说下c++工程中,如何布置引擎的lua脚本
3.1.1以前是要把刚才的cocos\scripting\lua-bindings\script目录下的文件,都复制到Resources下面,可加密,想改路径就在初始化引擎的时候弄,这里不介绍
3.3是把cocos\scripting\lua-bindings\script目录下的所有文件,拷贝到Resources/cocos下面
********

安卓下Andorid.mk文件增加两行

3.1.1按下面的方法加

LOCAL_C_INCLUDES := (LOCAL_PATH)/../../Classes \ (LOCAL_PATH)/…/…/cocos2d/extensions

LOCAL_WHOLE_STATIC_LIBRARIES += cocos_lua_static

$(call import-module,scripting/lua-bindings)

3.3按这样

LOCAL_C_INCLUDES := (LOCAL_PATH)/../../Classes \ (LOCAL_PATH)/…/…/…/…/…/external/lua/tolua

LOCAL_STATIC_LIBRARIES += cocos2d_lua_static

$(call import-module,scripting/lua-bindings/proj.android)

即可,如果你用了boost,可以再加,我把boost放到了ndk的第3方库里
$(call import-module,boost_1_55_0)