2013-12-15 90 views
3

編輯:所以問題出現在Java端。購買完成的監聽器沒有被調用。這是非常有用的:IabHelper PurchaseFinishedListener在Cocos2dx的主/ UI線程上運行代碼

我的Cocos2dx遊戲在Android和iOS上大部分運行良好。只想給我帶來麻煩的是Android應用內結算。

我使用JNI從C++調用Java。 Java代碼會在Google Play計費系統中來回運行,並最終回撥至C++代碼,指出要向用戶提供多少寶藏(成功購買的數量)。

從Java回到C++的調用做了一件很奇怪的事情。運行的C++代碼應該更新兩件事的顯示。但它只更新一個,並不一致。此外,多個從Java到C++的調用會導致CCNodes忽略觸摸並執行其他奇怪的事情。

在閱讀了類似的問題之後,我意識到也許Java到C++的調用不在主/ UI線程中。所以我試圖解決這樣的問題:

// Java code 
IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() { 
     public void onConsumeFinished(Purchase purchase, IabResult result) { 
      if (result.isSuccess()) { 
       String sku = purchase.getSku(); 
       if (sku.equals(IAB_ID_ABC)) { 
       me.runOnUiThread(new Runnable() { 
        public void run() { 
         callCppMethodFromJava_giveUserABC(); 
        } 
       }); 
       } 
     } 
    }; 

在這裏我試圖在main/UI線程上調用giveUserABC。 giveUserABC被稱爲但是它表現出如上所述的奇怪行爲。

我試過的另一件事是通過CCNotificationCenter在givenUserABC中發佈通知。這是在黑暗中拍攝的,但我讀到它在某個地方爲某人工作。

不幸的是,這些都沒有解決奇怪的行爲。任何幫助理解和解決這種情況非常感謝!

+0

你可以發佈C++部分嗎?特別是購買後的回調。 – Losiowaty

+0

@Losiowaty你對C++語法或其他東西感興趣嗎?語法沒有太多問題。將函數命名爲'void Java_org_cocos2dx_lib_Cocos2dxActivity_MyAwesomeFunction'。在Java代碼中,您將有'公共靜態本地無效MyAwesomeFunction();' – SundayMonday

回答

11

從我的經驗,你應該GLThread運行:

me.runOnGLThread(new Runnable() { 
    public void run() { 
    callCppMethodFromJava_giveUserABC(); 
    } 
}); 

正如我們所知,UiThread是一個Android應用程序的主線程,而Cocos2dxGLSurfaceView通常是在GL thrread運行。

所以,如果你想從Java調用C++,你應該在GL線程調用它。從C++調用Java時,通常應該在Ui線程中調用它。從我的經驗來看,這是正確的。

有關更多信息,runOnGLThread方法不是Android的api,它在cocos2d-x項目中實現org.cocos2dx.lib.Cocos2dxActivity.java

從源代碼,你可以很容易地發現,使用Cocos2dxGLSurfaceView.getInstance().queueEvent()代替this.runOnGLThread()也行。

+0

被卡在單邊行動計劃的Android和你們,救了我的屁股,謝謝! – Narek

+0

在這裏保存了另一個屁股!真棒。 – Jonny

+0

萬一有人想不通,爲什麼他們的GPG服務(谷歌玩遊戲服務)回調沒有做什麼,他們應該確保你正確的線程上做你需要做的工作。這有幫助。謝謝。 –

相關問題