“愤怒的小鸟”中,lua脚本是运行时部署在应用的data目录,同时做了脚本加密;
但是如果你的lua脚本有了模块包,脚本就会有多级目录,而android的data目录下是不允许有子目录;
当然,lua脚本也可以在运行时拷贝到外置sd卡中,不过既然放置在不安全的公共目录,就会有被第三方删除或篡改的危险,那么每次启动的时候必须做一次文件校验,同时,也必须对脚本进行加密,避免程序逻辑暴露;

lua自定义加载器

lua引擎提供了一个自定义加载器,当lua脚本中调用require时,会回调到自定义加载器的CFunction;利用这样特性,可以尝试取消掉脚本的运行时拷贝,而直接从应用的asset资源目录加载;自定义加载器的原理中,云风的blog中有介绍,以自定义方式加载lua模块
直接贴个代码实现

void addAssetLuaLoader(lua_State *L, lua_CFunction func)
{
   if (!func) return;

   lua_getglobal(L, "package");                   
   lua_getfield(L, -1, "loaders");   
   lua_pushcfunction(L, func);  
   int i=0;
   for ( i …

查看全文
Posted by zhengwen

前段时间在android环境中使用lua,采用的luabridge是luajava,遇到一个内存泄露问题,查了很久,终于定位了;

场景是这样的:
1:在lua中创建了一个java对象,将jobject指针传递给java;对应在luajava中,即传递了一个luaobject给java;java保存了这个对象;
2:在Lua中需要对这个java对象设置一个事件回调,比如说为某个控件setOnClickListener;
其中设置的代码是这样的:

local viewclick_cb={}
function viewclick_cb.onClick(v)
    self:cb(v)  
end
local listenerProxy  = luajava.createProxy('android.view.View$OnClickListener',viewclick_cb)       
javaobjhandler:setOnClickListener(ListenerProxy)   

lua和java交互时,对象生命周期管理分两种情况:

1:java对象传递个lua虚拟机,lua虚拟机为java对象创建一个userdata,在globalref中增加一个引用,标记这个java对象正在被使用;同时,为这个userdata设置一个__gc元方法,当lua对象需要被释放时,_gc元方法回调,释放掉java对象的globaref …


查看全文
Posted by zhengwen

lua

纯吐槽

前端时间对luabridge的性能问题很头痛,后来找到号称jni实现的jnlua, 从原理上说,如果luabridge在动态绑定的逻辑可以只在jni上完成,而不走虚拟机的解释器,性能上可以提升很多,在jnlua的项目主页上还找到了,5.1的android移植版,于是打开beyondcompare迅速合并了个5.2的android移植版,实际运行的时候直接秒退了.翻了下代码,一口老血.

jnlua号称jni实现,但事实上动态绑定的几个api还是通过java实现,由于luabridge的瓶颈基本都在反射那块,和luajava相比,jnlua没有性能上的优势,算是典型的重复造轮子

至于所谓的5.1的android移植版,它为了兼容android的lib不支持的java.beans.BeanInfo类,删除了相关的JavaModule,DefaultJavaReflector两个类,代价是android移植版不再支持了lua脚本中调用java!

口怕的是,jnlua的项目主页竟然还加了移植版的链接,

虽然应该支持开源项目,但是挂这样一个半成品项目在主页上,还是要说一句 你在外面这么屌,luajava知道吗

各位想用jnlua的android同学,如果非要用jnlua的话,移植的时候其实是可以引入一些第三方库的,比如openbeans

jnlua的代码结构较luajava层次分的更加清晰一些,api粒度更细; 好吧,个人觉得这种基础架构型的bridge,性能才是决定是否使用的第一要素,继续用luajava吧


查看全文
Posted by zhengwen

最近在做一个lua的android项目,对于lua的生态环境完全陌生,所以选用了个文档资料最全的lua bridge:luajava
luajava目前只支持到lua5.1,不过升级到5.2困难不大,主要是一些宏开关以及静态变量;然而实际运行的时候发现卡的很不行,ui频繁掉祯,profile后发现90%+的cpu耗时在luajava中

看了一下luajava本身代码量不大;索性就追了一下,luajava的native层就一个luajava.c,java层,除了LuaJavaApi.java,其他java类都是Value Object

lua逻辑分析

先看lua创建java object的代码,luajava.c中

int javaNewInstance( lua_State * L )
{     
    //some code …..
    method  = ( *javaEnv )->GetStaticMethodID( javaEnv , luajava_api_class , "javaNewInstance" ,"(ILjava/lang/String;)I" );
     //先调用java层创建javaobject
    javaClassName = ( *javaEnv )->NewStringUTF( javaEnv , className …

查看全文
Posted by zhengwen