2013-12-15 91 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服务(谷歌玩游戏服务)回调没有做什么,他们应该确保你正确的线程上做你需要做的工作。这有帮助。谢谢。 –

相关问题