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.
- Extraño: no se puede cambiar el valor de Integer en jni
- Filtrado de MatOfDMatch
- Desbordamiento de ReferenceTable (máx = 512) JNI
- Clases del editor de vídeo de Android
- JNI, método booleano de llamada
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!
- Actualización de la interfaz de usuario de hilo de fondo utilizando código nativo enteramente (sin JNI)?
- Declaración implícita incompatible de la función incorporada Advertencia Uso de NDK con LAME
- Señal fatal 11 (SIGSEGV)
- Gradle de Android, libs nativas para diferentes arquitecturas
- Cómo ver la tabla de referencia local de JNI?
- No se pudo cargar libfoo: findLibrary returned null
- UnsatisfiedLinkError (Método nativo no encontrado)
- ¿Puedo usar excepciones de C ++ en la biblioteca JNI en Android?
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.