• luaj luaoc 回调函数传递的一些小总结


    问题场景:我们的游戏在支付时,由于第三方支付比较费时,可能在支付的过程中,我们lua写的cocos2dx项目会断网,我们的游戏有自动重连的机制。我就想,如果断线好了以后,支付完成了,那在断网之前传入的回调函数是否能被成功执行到呢?

    就在网上发现了这篇文章 http://dualface.github.io/blog/2013/01/01/call-java-from-lua/#lua20function20E79A84E5BC95E794A8E8AEA1E695B0E599A8 , 个人觉得写的超赞。

    “Lua 虚拟机中,Lua function 以值的形式保存。但这个值无法直接给 Java 用,所以 luaj 做了一个 Lua function 引用表。当一个 Lua function 传递给 Java 时,这个 function 对应的值会被存在引用表中,并获得一个唯一的引用 ID (整数)。Java 代码拿到这个引用 ID 后,就可以很方便的调用该 Lua function 了。” 

    “Lua 虚拟机具有自动垃圾回收机制。Lua function 既然是值,那么在没有被使用时自然会被回收掉。所以 luaj 提供了 retainLuaFunction() 和 releaseLuaFunction() 两个函数用于增减 Lua function 的引用计数。

    将一个 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线程一些基本知识,推荐。

    贴一下我的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简单的回调

    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);
                }
            });
        }
  • 相关阅读:
    asp.net中获取网站根目录和物理路径的方法
    解决Windows 程序界面闪烁问题的一些经验
    winform中怎样使DataGridView的某一列可以添加两个Button控件
    Asp.net中实现多语言的Page的扩展的基类
    c#自杀程序的关键方法
    30岁前成功的12条黄金法则
    分享一个收集到的文件和目录操作类FileSystemObject
    有时候我们需要搜索指定栏目下的文章,如何实现呢?
    安静删除服务器超级多的文件,有的文件夹文件过多而不方便删除
    SQLServer2005数据库备份与还原
  • 原文地址:https://www.cnblogs.com/lan0725/p/3867962.html
Copyright © 2020-2023  润新知