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

3
编辑:问题出在Java这边。购买完成的监听器没有被调用。这篇文章非常有帮助:IabHelper PurchaseFinishedListener 我的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();
                    }
                 });
               }
        }
    };

在这里,我试图在主/UI线程上调用giveUserABC。虽然giveUserABC被调用了,但它表现出了如上所述的奇怪行为。

我尝试的另一件事是通过CCNotificationCenter在giveUserABC中发布通知。这是一个瞎猜,但我读到有人说它在某个地方起作用了。

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


你能贴出C++部分吗?特别是购买后的回调。 - Losiowaty
@Losiowaty,你对C++语法感兴趣还是其他什么?语法不是太大的问题。将你的函数命名为void Java_org_cocos2dx_lib_Cocos2dxActivity_MyAwesomeFunction之类的名称。在Java代码中,你可以这样写:public static native void MyAwesomeFunction(); - SundayMonday
1个回答

13

根据我的经验,你应该在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()也可以。

我在Android IAPs上遇到了困难,你们帮了我大忙,谢谢! - Narek
又挽救了一个菜鸟!真棒。 - Jonny
如果有人搞不清楚为什么他们的GPG服务(Google Play Games Services)回调没有按照预期运行,请确保你在正确的线程上执行需要完成的工作。这很有帮助。谢谢。 - Hunter-Orionnoir
如果我们只是在C++中更改变量的值,我们是否需要调用runOnGLThread? - isJulian00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接