luaj luaoc 回調函數傳遞的一些小總結

問題場景:咱們的遊戲在支付時,因爲第三方支付比較費時,可能在支付的過程當中,咱們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);
            }
        });
    }
相關文章
相關標籤/搜索