问题场景:咱们的游戏在支付时,因为第三方支付比较费时,可能在支付的过程当中,咱们lua写的cocos2dx项目会断网,咱们的游戏有自动重连的机制。我就想,若是断线好了之后,支付完成了,那在断网以前传入的回调函数是否能被成功执行到呢?java
就在网上发现了这篇文章 http://dualface.github.io/blog/2013/01/01/call-java-from-lua/#lua20function20E79A84E5BC95E794A8E8AEA1E695B0E599A8 , 我的以为写的超赞。android
“Lua 虚拟机中,Lua function 以值的形式保存。但这个值没法直接给 Java 用,因此 luaj 作了一个 Lua function 引用表。当一个 Lua function 传递给 Java 时,这个 function 对应的值会被存在引用表中,并得到一个惟一的引用 ID (整数)。Java 代码拿到这个引用 ID 后,就能够很方便的调用该 Lua function 了。” git
“Lua 虚拟机具备自动垃圾回收机制。Lua function 既然是值,那么在没有被使用时天然会被回收掉。因此 luaj 提供了 retainLuaFunction() 和 releaseLuaFunction() 两个函数用于增减 Lua function 的引用计数。github
将一个 Lua function 以引用 ID 的形式传入 Java 时,luaj 会自动增长引用 ID 的计数器,因此在 Java 方法里能够放心的异步调用 Lua function。但在不须要使用该 Lua function 后,必定要调用 releaseLuaFunction() 减小该引用 ID 的计数器。当计数器为 0 时,会自动释放该 Lua function。服务器
若是了解 cocos2d-x 中 CCObject 的 autorelease 机制,那么对引用计数应该很熟悉,二者是彻底相同的实现机制。”异步
这两段说的很是好。这样,我就明白,即便lua短线重来回来,由于Lua虚拟机没有重启,那么lua function 引用表也在,而且我没有release, 那确定是能够回调成功的。顺便这篇文章也告诉了我UI线程和GL线程一些基本知识,推荐。ide
贴一下个人lua代码和java回调代码函数
-- android 服务器产生订单后 客户端开始正式购买操做 function androidStartPay(data) if isAdroid() == false then print("不容许的平台支付") disposeLoading() payError() return end local presult = GameDataCenter:GetOrderInfo(data) local javaMethodName = "startPay" local javaParams = {presult.orderNo, presult.money, userID, userName, presult.payName, userToken, presult.productId, androidPayBack} local javaMethodSig = "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V" luaj.callStaticMethod(PACKAGE_NAME, javaMethodName, javaParams, javaMethodSig) end
java简单的回调lua
private static void setLuaCallback(final int callback, final String result) { BaseUtils.D(TAG, "setLuaCallback ========" + result); if (callback <= 0) { BaseUtils.E(TAG, " callback is null"); return; } LuaCallback = 0; // 回调lua // s_instance.Resume(); // s_instance.onWindowFocusChanged(true); s_instance.runOnGLThread(new Runnable() { @Override public void run() { Cocos2dxLuaJavaBridge.callLuaFunctionWithString(callback, result); Cocos2dxLuaJavaBridge.releaseLuaFunction(callback); } }); }