在cocos2dx纯lua脚本逻辑开发中,由于脚本与安卓之间的沟通问题,使得在测试中,脚本错误难以被报告和记录,给测试工作带来了很大的不便。
本文通过lua调用c++方法以及jni的使用,使lua提供的错误信息能够在安卓应用的层面被报告和记录。
主要步骤:
一、信息从lua发送到c++并处理:
1、在项目的c++代码中,编写方法并暴露给lua,使得该方法可以接受来自lua的文本信息并进行处理。
2、在打印错误的方法中,调用c++暴露的接口,传递错误信息并进行处理。
3、如有需要,在发送错误信息的同事暂停游戏。
二、信息从c++发送到java并处理:
1、在项目的java代码中,编写方法,该方法以文本信息为参数并对该信息进行处理。
2、在项目的c++代码中,编写方法,该方法被步骤一中c++代码的方法所调用(或在原方法上处理),该方法使用jni调用java中的方法并将错误信息传递。
三、java对文本进行处理
1、在项目的java代码中,编写方法,被步骤二中的java方法调用(或原方法继续处理),将错误信息打印到文件同时创建对话框显示错误信息。
下面对该解决方案的详细步骤进行介绍:
一、
1、在c++代码的项目目录下,创建一个类LogToAndroid,该类具有一个方法WriteLog,参数是一个字符串,用于被lua调用传入错误信息进行处理。
void LogToAndroid::WriteLog(string str)
{
cout<<"receive a log from lua"<<endl;
cout<<str<<endl;
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
<span style="white-space:pre"> </span>//此处执行步骤二调用jni方法
#else
#endif
}
以上是简单表示的代码,从代码中我们可以看到
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
这个宏,表示当在安卓上进行调试时,执行中间的方法。
然后我们使用tolua工具,将这个类的方法暴露给lua,具体方法可以参考其他教程。
最后得到一个包含int register_all_logtoandroid(lua_State* tolua_S);方法的注册文件,在AppDelegate.cpp中直接或间接地调用这个方法,注册LogToAndroid这个类给lua使用。
2、然后进入到lua脚本,找到main.lua文件,里面有一个__G__TRACKBACK__的函数,这个函数我们可以在cocos引擎的luaStack.cpp中看到它的身影。
大概的作用是,当lua报错给lua引擎时,c++层通过操作lua的stack调用lua中这个方法对错误信息进行打印等处理。这个方法的具体调用路径等我弄明白了再做进一步解释,可能在有些版本中是没有的,那么这个步骤可能需要找到替代方法(具体思路是在lua或者c++中找到打印错误的地方,截获错误信息并调用下一步骤的方法)。
function __G__TRACKBACK__(errorMessage)
local a = "----------------------------------------".."\n"
local b = "LUA ERROR: " .. tostring(errorMessage) .. "\n"
local c = debug.traceback("", 2).."\n"
print(a..b..c..a)
LogToAndroid:WriteLog(a..b..c..a)
end
这个方法在quick中的作用是通过print打印错误信息,这里对错误信息进行整理后,又调用了