2011-11-10 34 views
6

Io chiamo un NativeActivity da una JavaActivity. Il punto di ingresso della mia NativeActivity èNativeActivity non termina

android_main(struct android_app* state) 

Alla fine di questo, io chiamo

ANativeActivity_finish 

Tuttavia la mia attività nativa blocca solo, invece di tornare alla attività Java che lo ha chiamato (si chiamava semplicemente usando startActivity). Sembra che sia in uno stato di pausa. L'unico modo per ottenerlo per tornare all'attività precedente è chiamare exit(0) alla fine del mio android_main, tuttavia questo uccide il processo e causa altri problemi.

Come posso uscire correttamente da NativeActivity e tornare a JavaActivity che lo ha chiamato?

+0

mi chiedo perché questa domanda non è stato risposto, non ci sono molte persone che hanno bisogno di chiamare NativeActivity's from (Java) Activity, e ritorno da loro? –

risposta

6

Mi imbatto nello stesso problema. Fondamentalmente funziona per me quando ANativeActivity_finish (..) viene chiamato nel ciclo principale, perché invalida gli stati e termina l'app stessa impostando lo stato-> destroyRequested su 1 dopo aver chiamato ANativeActivity_finish (..) nel vuoto statico 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); 
    } 
    } 
} 

Beh, è ​​troppo tardi per voi credo, ma ho trascorso così tanto tempo su di esso, perché non riuscivo a trovare un sultion così ho posto qui per tutti coloro che corre negli stessi problemi. Ulteriori informazioni su altre cose complicate relative al distacco e alle chiamate possono essere trovate qui: Access Android APK Asset data directly in c++ without Asset Manager and copying

+0

Posso chiedere a quale punto del ciclo di vita dell'app hai impostato Closed su true? In quale APP_STATE? – Dev2rights

+0

Questo succede nel ciclo principale del mio motore. Ogni volta che l'utente lascia il gioco, ad esempio quando si preme il pulsante Indietro nel menu principale e l'utente accetta la richiesta di chiudere il gioco. Pertanto, ciò non si verifica in nessun APP APPUNTAMENTO Android specifico. Ma in effetti, la chiamata Closed = true può avvenire solo nello "stato" di animazione perché aggiorno il mio sistema pari in là. if (engine.animating) {// materiale animazione qui} – odbb

2

Una soluzione che alla fine ha funzionato per completare una sottoclasse di a) NativeActivity dall'app (lato nativo) stava chiamando un metodo java che esegue finish() sul thread dell'interfaccia utente.

lato C/C++:

lato
... 

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

Java:

public class CustomNativeActivity extends NativeActivity { 

    ... 

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