2.2.3自己接入的模块出问题

在升级到2.2.3以后,出现了自己接入的C++模块提供的函数调用时,提示为nil的错误。

  1. 在旧版本(应该是2.1.x)中接入该模块是能够正确运行的
  2. 2.2.3中调用该模块中单例类的static函数(返回类的单例指针)是能够执行的,并且返回的对象能够被正确dump为userdata,内存值也是正确的。
  3. 但是调用类的成员函数,就会报错为成员函数为nil
  4. 在廖大的2.2.3发布说明中有这样一段话:“嬀猀椀稀攀=2]对 tolua++ 底层的重大改进:更容易使用的 C++ 类型映射、隐形内存泄露等问题”,是否就是因为修改了底层,导致的c++导出函数调用出错?是否有新的tolua导出的规则需要遵循?

请知道的同学解答一下,不然没法继续升级2.2.3了。

最后bs一下这个论坛的编辑工具,我点击发布帖子,标题长了,返回来修改标题,正文全没了。。。。

请提供一个简单的实例来验证一下呢?

  1. 麒麟子: 我是直接在已有的工程上面升级的,也使用了新风格的API,其它的都正常运行,就是运行到自定义模块函数的时候就会出问题。

  2. 阳光七月:

类的静态函数能够正确调用,我在C++代码里面跟了的
比如lua中调用一个类的静态函数初始化全局变量
netWriter = NetWriter:getInstance() 能够成功,netWriter dump出来也是正确的userdata值

然后调用 netWriter :insertString(“XXX”),就会提示 LUA ERROR: :7: attempt to call method ‘insertString’ (a nil value)

getInstance是static函数,返回类的单例,insertString是该类非static的成员函数,两个函数都是在tolua中加载了的。以前旧版本quick调用不会有问题。
其它的自定义模块的类静态函数也能正确调用,但是类成员都调用报错为函数为nil

这些函数在旧有版本中是能够正确调用的,升级版本后,我接入的方式也是和旧有的不变,但是为什么会出现非static成员出现这个问题呢

不应该存在这样的问题才对,Node、Sprite这些类都是有自己的成员函数的,要是不能用整个都跑不起来了。
你的接入方式有什么特别的地方吗?

就是没有啥特别的地方,所以才会有疑问,接入方式和旧版本完全一样。我的tolua初始化是在现在的StartupCall::startup()函数里面做的,我插入了一段代码:

   
    // set default scene
    CCScene *scene = CCScene::create();
    if (CCDirector::sharedDirector()->getRunningScene())
    {
        CCDirector::sharedDirector()->replaceScene(scene);
    }
    else
    {
        CCDirector::sharedDirector()->runWithScene(scene);
    }

    lua_State *L = pEngine->getLuaStack()->getLuaState();

    //load scut sdk
    string script_dir = path.substr(0, path.find_last_of("/"));
    string root_dir = script_dir.substr(0, script_dir.find_last_of("/"));
    ScutExt::Init(root_dir+"/", L);
    
    // load script
    string env = "__LUA_STARTUP_FILE__=\"";
    env.append(path);
    env.append("\"");
    pEngine->executeString(env.c_str());

其中 //load scut sdk这段就是我接入的scut的客户端sdk,为了保证tolua的state是和全局的一致,我把lua_State *L = pEngine->getLuaStack()->getLuaState();这个都传进去了,但是效果和使用它默认的通过CCLuaEngine::defaultEngine()取lua_State来初始化tolua函数是一样的,都是static能够调用,成员不能调用。所以说我就很奇怪是否2.2.3需要遵循什么样和以前不一致的规则来接入C ++模块?

PS:旧版没有StartupCall::startup()这个函数,但是这个函数里面的代码一眼就知道是旧版的哪个位置的,所以我认为流程和旧版没有变哈,旧版我也是插入在这个位置的。调用没有问题

ScutExt::Init(root_dir+"/", L);
这个是SDK提供的接口是吗?没有源码,是打在库里的?

对此问题的修改已经递交了PR