前段时间在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