java - Ejecutando código en el hilo principal/UI en Cocos2dx
android jni (1)
Desde mi experiencia, deberías ejecutarlo en GLThread:
me.runOnGLThread(new Runnable() {
public void run() {
callCppMethodFromJava_giveUserABC();
}
});
Como sabemos, UiThread es el hilo principal de una aplicación de Android, mientras que Cocos2dxGLSurfaceView
generalmente se ejecuta en GL thrread.
Entonces, si desea llamar desde Java a C ++, debe llamarlo a la conversación GL. Mientras llamas desde C ++ a Java, normalmente deberías llamarlo en Ui thread. Es correcto en la mayoría de los casos de mi experiencia.
Para obtener más información, el método runOnGLThread
no es una API de Android, se obtiene org.cocos2dx.lib.Cocos2dxActivity.java
en el proyecto cocos2d-x.
Desde el código fuente, puede encontrarlo fácilmente, usando Cocos2dxGLSurfaceView.getInstance().queueEvent()
lugar de this.runOnGLThread()
también está bien.
Editar: Entonces, el problema estaba en el lado de Java. La compra del oyente terminado no fue convocada. Esto fue muy útil: IabHelper PurchaseFinishedListener
Mi juego Cocos2dx funciona bien en Android e iOS en su mayor parte. Solo piensa que causarme problemas es la facturación en la aplicación de Android.
Estoy usando JNI para llamar desde C ++ a Java. El código de Java va y viene con el sistema de facturación de Google Play y, en última instancia, vuelve a llamar al código de C ++ que indica cuánto tesoro le debe dar al usuario (cantidad comprada con éxito).
La llamada de Java a C ++ está haciendo algo muy extraño. El código de C ++ que se ejecuta debe actualizar la visualización de dos cosas. Sin embargo, solo actualiza uno y no es consistente. También llamadas múltiples 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í intento llamar a giveUserABC en el hilo principal / UI. Se llama a giveUserABC, sin embargo, muestra un comportamiento extraño como se describe anteriormente.
Otra cosa que probé es publicar una notificación a través de CCNotificationCenter en giveUserABC. Este fue un tiro en la oscuridad, pero leí que funcionó en alguna parte para alguien.
Lamentablemente, nada de esto ha solucionado el extraño comportamiento. ¡Cualquier ayuda para entender y arreglar esta situación es muy apreciada!