Ejecutar código en el subproceso principal / UI en Cocos2dx

Edit: Así que el problema estaba en el lado de Java. La compra terminó el oyente no fue llamado. Esto fue muy útil: IabHelper PurchaseFinishedListener

Mi juego de Cocos2dx funciona bien en Android e iOS en su mayor parte. Sólo piensa en darme problemas es Android en la aplicación de facturación.

Estoy usando JNI para llamar desde C ++ a Java. El código Java va de un lado a otro con el sistema de facturación de Google Play y en última instancia llama de nuevo al código C ++ indicando cuánto tesoro dar al usuario (cantidad comprada con éxito).

La llamada desde Java de nuevo a C ++ está haciendo algo muy extraño. El código C ++ que se ejecuta debe actualizar la presentación de dos cosas. Sin embargo, sólo actualiza uno y no es coherente. También múltiples llamadas de Java a C + + resultan en CCNodes ignorando toques y haciendo otras cosas extrañas.

Después de leer sobre problemas similares me di cuenta de que tal vez la llamada de Java a C ++ no estaba en el hilo principal / UI. Así que traté de arreglarlo así:

// 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(); } }); } } }; 

Aquí estoy tratando de llamar a giveUserABC en el hilo principal / UI. giveUserABC se llama sin embargo está exhibiendo un comportamiento extraño como se describió anteriormente.

Otra cosa que he intentado es publicar una notificación a través de CCNotificationCenter en giveUserABC. Esto fue un tiro en la oscuridad pero leí que funcionó en alguna parte para alguien.

Desafortunadamente nada de esto ha arreglado el comportamiento extraño. Cualquier ayuda en la comprensión y la fijación de esta situación es muy apreciada!

De mi experiencia, debe ejecutarlo en GLThread:

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

Como sabemos, el UiThread es el hilo principal de una aplicación para Android, mientras que el Cocos2dxGLSurfaceView se ejecuta normalmente en GL thrread.

Así que si quieres llamar desde Java a C ++, deberías llamarlo en el hilo GL. Mientras llama de C ++ a Java, por lo general debe llamar a Ui hilo. Es justo en la mayoría de los casos de mi experiencia.

Para obtener más información, el método runOnGLThread no es un api de Android, se logra org.cocos2dx.lib.Cocos2dxActivity.java en el proyecto cocos2d-x.

Desde el código fuente, puedes encontrar fácilmente eso, usando Cocos2dxGLSurfaceView.getInstance().queueEvent() lugar de this.runOnGLThread() también está bien.

  • Compilación de Android JNI para OpenCV en Mac OSX
  • Cambiar Actividad con JNI Llamar o usar Openfeint provoca App-Crash
  • Leer el campo entero del objeto Java con C ++ (JNI)
  • Android: La forma más eficiente de pasar algunos bytes de sólo lectura a C ++ nativo
  • Integración de Unity3d con android
  • Convertir de YUV a RGB en c + + (android-ndk)
  • Uso de javah en linux
  • ¿Cómo realizar llamadas JNI desde un servicio incluso si la aplicación está cerrada?
  • Cómo utilizar OpenSSL Library en la aplicación ANDROID
  • Cómo pasar una estructura como un argumento a la función java o volver a java de jni
  • UnityPlayerActivity no recibe registro onCreate ()
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.