1

What is the proper way to exit from a native activity? That is, how do I end my android_main function. If I do nothing then the program hangs and eventually the device terminates it. If I call exit(0) then it does exit, but it prints a dump in the log file, indicating that it hasn't cleaned up correctly.

So how I am supposed to exit the application correctly?

EDIT: I am writing a native activity purely in C++. I am asking about how to return/complete my android_main routine. I have zero Java code in this project.

The top snippet of the log failure:

V/threaded_app( 5419): NativeWindowDestroyed: 0x29c490 -- 0x29d788
I/DEBUG   ( 1055): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   ( 1055): Build fingerprint: 'LENOVO/IdeaPad_Tablet_A1_07/A1_07:2.3.4/GRJ22/eng.user.20120209.100319:user/release-keys'
I/DEBUG   ( 1055): pid: 5419, tid: 5427  >>> eu.eversystems.sample <<<
I/DEBUG   ( 1055): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000024
I/DEBUG   ( 1055):  r0 0029d788  r1 463ddb64  r2 5f776e64  r3 00000000
edA-qa mort-ora-y
  • 30,295
  • 39
  • 137
  • 267

3 Answers3

1

I haven't tried this, but I would imagine that calling ANativeActivity_finish() on the native activity pointer would work.

kelnos
  • 874
  • 5
  • 11
  • This other thread also seems to indicate problems with this: http://stackoverflow.com/questions/8088086/nativeactivity-does-not-finish (I'll still try it and see what happens though) – edA-qa mort-ora-y Aug 29 '12 at 14:04
0

If you have a look at the native-activity example in the NDK, android_main is a void function so you have just "return" when you want to "exit".

You should however take care with how/when you return from android_main. Apps on Android don't really "end" under normal circumstances. They are brought into and out of foreground. Naturally if the process is in the background and the OS devices it is no longer required it will be terminated as you say. In this case I would expect the "destroyRequested" field in the android_native_app_glue library to be set and this is what should trigger a return from android_main. This will allow you to exit your application gracefully.

In all other cases you simply want you app to honor the various states in which it may find itself.

Namely:

/**
 * Command from main thread: the AInputQueue has changed.  Upon processing
 * this command, android_app->inputQueue will be updated to the new queue
 * (or NULL).
 */
APP_CMD_INPUT_CHANGED,

/**
 * Command from main thread: a new ANativeWindow is ready for use.  Upon
 * receiving this command, android_app->window will contain the new window
 * surface.
 */
APP_CMD_INIT_WINDOW,

/**
 * Command from main thread: the existing ANativeWindow needs to be
 * terminated.  Upon receiving this command, android_app->window still
 * contains the existing window; after calling android_app_exec_cmd
 * it will be set to NULL.
 */
APP_CMD_TERM_WINDOW,

/**
 * Command from main thread: the current ANativeWindow has been resized.
 * Please redraw with its new size.
 */
APP_CMD_WINDOW_RESIZED,

/**
 * Command from main thread: the system needs that the current ANativeWindow
 * be redrawn.  You should redraw the window before handing this to
 * android_app_exec_cmd() in order to avoid transient drawing glitches.
 */
APP_CMD_WINDOW_REDRAW_NEEDED,

/**
 * Command from main thread: the content area of the window has changed,
 * such as from the soft input window being shown or hidden.  You can
 * find the new content rect in android_app::contentRect.
 */
APP_CMD_CONTENT_RECT_CHANGED,

/**
 * Command from main thread: the app's activity window has gained
 * input focus.
 */
APP_CMD_GAINED_FOCUS,

/**
 * Command from main thread: the app's activity window has lost
 * input focus.
 */
APP_CMD_LOST_FOCUS,

/**
 * Command from main thread: the current device configuration has changed.
 */
APP_CMD_CONFIG_CHANGED,

/**
 * Command from main thread: the system is running low on memory.
 * Try to reduce your memory use.
 */
APP_CMD_LOW_MEMORY,

/**
 * Command from main thread: the app's activity has been started.
 */
APP_CMD_START,

/**
 * Command from main thread: the app's activity has been resumed.
 */
APP_CMD_RESUME,

/**
 * Command from main thread: the app should generate a new saved state
 * for itself, to restore from later if needed.  If you have saved state,
 * allocate it with malloc and place it in android_app.savedState with
 * the size in android_app.savedStateSize.  The will be freed for you
 * later.
 */
APP_CMD_SAVE_STATE,

/**
 * Command from main thread: the app's activity has been paused.
 */
APP_CMD_PAUSE,

/**
 * Command from main thread: the app's activity has been stopped.
 */
APP_CMD_STOP,

/**
 * Command from main thread: the app's activity is being destroyed,
 * and waiting for the app thread to clean up and exit before proceeding.
 */
APP_CMD_DESTROY,

The sample code is here:

http://developer.android.com/reference/android/app/NativeActivity.html

Jason Polites
  • 5,571
  • 3
  • 25
  • 24
-1

U can use

android:noHistory="true" 

in the manifest for all your activities :) and then

finish() 

your current activity ..youre done! :) i hope it help

Jagan
  • 692
  • 1
  • 12
  • 38