ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-07-15 12:26:51  阅读:292  来源: 互联网

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


编辑:所以问题出在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发布通知.这是一个在黑暗中拍摄但我读到它在某个地方工作的人.

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

解决方法:

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

标签:java,android,in-app-billing,cocos2d-x,java-native-interface
来源: https://codeday.me/bug/20190715/1467643.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有