在Cocos2dx中的主/ UI线程上运行代码

时间:2013-12-15 02:01:55

标签: java android java-native-interface cocos2d-x in-app-billing

编辑:所以问题出在Java方面。购买完成的听众没有被调用。这非常有用:IabHelper PurchaseFinishedListener

我的Cocos2dx游戏在Android和iOS上运行良好。只考虑给我带来麻烦的是Android In-App Billing。

我正在使用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被称为奇怪的行为。

我尝试的另一件事是在giveUserABC中通过CCNotificationCenter发布通知。这是在黑暗中拍摄的,但我读到它在某个地方为某人工作。

不幸的是,这一切都没有解决这种奇怪的行为。非常感谢任何理解和解决这种情况的帮助!

1 个答案:

答案 0 :(得分:12)

根据我的经验,你应该在GLThread上运行它:

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

众所周知, UiThread 是Android应用的主要线程,而Cocos2dxGLSurfaceView通常是在GL浏览器上运行。

所以如果你想从Java调用C ++,你应该在GL线程中调用它。在从C ++调用Java时,通常应该在Ui线程中调用它。在大多数情况下,从我的经验来看是正确的。

有关详细信息,runOnGLThread方法不是Android的api,它在cocos2d-x项目中实现org.cocos2dx.lib.Cocos2dxActivity.java

从源代码中,您可以轻松找到,使用Cocos2dxGLSurfaceView.getInstance().queueEvent()代替this.runOnGLThread()也可以。

相关问题