2011-11-10 22 views
6

Wzywam NativeActivity z JavaActivity. Punkt wejścia mojego NativeActivity jestNativeActivity nie kończy się

android_main(struct android_app* state) 

Pod koniec tego wzywam

ANativeActivity_finish 

Jednak moja aktywność natywnej prostu wisi, zamiast wrócić do aktywności Java, który nazwał go (ją nazywano po prostu używając startActivity). Wygląda na to, że jest w stanie pauzy. Jedynym sposobem, w jaki mogę go uzyskać, aby powrócić do poprzedniej aktywności, jest wywołanie exit(0) na końcu mojego android_main, jednak to zabija proces i powoduje inne problemy.

Jak mogę pomyślnie zakończyć działanie NativeActivity i powrócić do właściwości JavaActivity, która go nazwała?

+0

Zastanawiam się, dlaczego to pytanie nie zostało odebrane, są nie wielu ludzi, którzy muszą zadzwonić NativeActivity z (Java) Activity i powrócić z nich? –

Odpowiedz

6

Wpadam na ten sam problem. Zasadniczo działa to dla mnie, gdy ANativeActivity_finish (..) jest wywoływana w pętli głównej, ponieważ unieważnia ona stany i kończy samą aplikację ustawiając state-> destroyRequested na 1 po wywołaniu ANativeActivity_finish (..) w statycznej pustce 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); 
    } 
    } 
} 

Cóż to jest za późno, jak sądzę, ale spędziłem tak dużo czasu na to, bo nie mógł znaleźć sultion więc po to tutaj dla każdego, kto prowadzi do tych samych problemów. Więcej o innej skomplikowanej rzeczy związanych z odłączyć i dołączyć połączenia można znaleźć tutaj: Access Android APK Asset data directly in c++ without Asset Manager and copying

+0

Czy mogę zapytać, w którym punkcie cyklu życia aplikacji ustawiłeś Closed na true? W której APP_STATE? – Dev2rights

+0

To się dzieje w głównej pętli mojego silnika. Zawsze, gdy użytkownik opuszcza grę, tj. Po naciśnięciu przycisku Wstecz w menu głównym, a użytkownik akceptuje monit o zamknięcie gry. Tak więc nie dzieje się to w żadnym konkretnym APP_STATE na Androida. Ale w rzeczywistości wywołanie Closed = true może nastąpić tylko w animowanym "stanie", ponieważ aktualizuję tam swój system parzystości. if (engine.animating) {// tutaj animacje} – odbb

2

Rozwiązanie, które ostatecznie pracował dla mnie, aby zakończyć (podklasa a) NativeActivity z aplikacji (native bocznej) dzwoni metoda java który uruchamia finish() w wątku interfejsu użytkownika.

C/C++ strona:

strona
... 

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(); 
      } 
     }); 
    } 
} 
Powiązane problemy