在Cocos2dx中的主/ UI线程上运行代码
编辑:所以问题出在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(); } }); } } };
在这里,我试图在主/ 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()
也可以。