2011-11-10 7 views
6

J'appelle un NativeActivity d'une JavaActivity. Le point d'entrée de mon NativeActivity estNativeActivity ne se termine pas

android_main(struct android_app* state) 

A la fin de cela, j'appelle

ANativeActivity_finish 

Cependant, mon activité native pend juste, au lieu de retourner à l'activité Java qui l'a appelé (il a été appelé en utilisant simplement startActivity). Il semble que ce soit dans un état de pause. La seule façon que je peux obtenir pour revenir à l'activité précédente est en appelant exit(0) à la fin de mon android_main, mais cela tue le processus et provoque d'autres problèmes. Comment puis-je quitter avec succès mon NativeActivity et revenir à l'JavaActivity qui l'a appelé?

+0

Je me demande pourquoi cette question n'a pas été répondu, sont-il pas beaucoup de gens qui ont besoin d'appeler NativeActivity est de (Java) Activity, et de retour d'eux? –

Répondre

6

Je rencontre le même problème. Fondamentalement cela fonctionne pour moi quand ANativeActivity_finish (..) est appelé dans la boucle principale, car il invalide les états et finit l'application elle-même en définissant state-> destroyRequested à 1 après avoir appelé ANativeActivity_finish (..) dans le void static android_app_destroy (struct android_app * android_app) (android_native_app_glue.c C: 173).

void android_main(struct android_app* state) 
{ 
    // Attach current state if needed 
    state->activity->vm->AttachCurrentThread(&state->activity->env, NULL); 
    ... 
    // our main loop for the app. Will only return once the game is really finished. 
    while (true) { 
    ... 
    while ((ident=ALooper_pollAll(engine.animating ? 0 : -1, NULL, &events,(void**)&source)) >= 0) { 
     ... 
     // Check if we are exiting. Which is the case once we called ANativeActivity_finish(state->activity); 
     if (state->destroyRequested != 0) 
     { 
     // Quit our app stuff herehere 
     // detatch from current thread (if we have attached in the beginning) 
     state->activity->vm->DetachCurrentThread(); 
     // return the main, so we get back to our java activity which calle the nativeactivity 
     return; 
     } 
    } 
    if (engine.animating) 
    { 
     // animation stuff here 
    } 
    // if our app told us to finish 
    if(Closed) 
    { 
     ANativeActivity_finish(state->activity); 
    } 
    } 
} 

Eh bien, il est trop tard pour vous, je suppose, mais j'ai passé tellement de temps là-dessus parce que je ne pouvais pas trouver un sultion donc je posterai ici pour tous ceux qui se jette dans les mêmes problèmes. Plus d'informations sur d'autres trucs liés aux appels detach et attach peuvent être trouvés ici: Access Android APK Asset data directly in c++ without Asset Manager and copying

+0

Puis-je demander à quel moment dans le cycle de vie de l'application définissez-vous Closed à true? À quel APP_STATE? – Dev2rights

+0

Cela se produit dans la boucle principale de mon moteur. Chaque fois que l'utilisateur quitte le jeu, c'est-à-dire lorsque le bouton de retour est enfoncé dans le menu principal et que l'utilisateur accepte l'invite pour fermer la partie. Donc, cela ne se produit pas dans un APP_STATE Android spécifique. Mais en fait, l'appel Closed = true ne peut se produire que dans l'état "animant" parce que je mets à jour mon système même là-dedans. if (engine.animating) {// trucs d'animation ici} – odbb

2

Une solution qui a finalement fonctionné pour moi de terminer une (sous-classe de) NativeActivity de l'application (côté natif) appelait une méthode java cela s'exécute finish() sur le thread UI.

C/côté C:

... 

jmethodID FinishHim = jni->GetMethodID(activityClass, "FinishMe", "()V"); 
jni->CallVoidMethod(state->activity->clazz, FinishHim); 

côté Java:

public class CustomNativeActivity extends NativeActivity { 

    ... 

    public void FinishMe() { 
     this.runOnUiThread(new Runnable() { 
      public void run() { 
       finish(); 
      } 
     }); 
    } 
}