Además de la gran respuesta de Léon Pelletier:
- Algunas cosas son más fáciles de hacer en un lenguaje de bajo nivel.
Cosas como el procesamiento de video, el procesamiento de paquetes, la codificación y decodificación de audio, cualquier cosa que use estructuras de memoria complejas y retransmita cómo los datos se representan binariamente en la memoria. - A veces necesita un nivel de acceso bajo a las API del sistema operativo.
El código NDK le permite acceder a las API de Linux y Android que no siempre están disponibles para los programadores de Java.
El NDK le permite escribir contenedores Java para interfaces c / c ++ usando JNI. - El código nativo puede permitirle reemplazar segmentos de la aplicación sin tener que actualizar desde el Android Market. Si su aplicación incluye paquetes ejecutables compilados, puede descargar una versión más reciente de esos ejecutables sin tener que actualizar la aplicación desde Google Play.
Tenga en cuenta que este es un riesgo de seguridad importante, por lo que si siempre se asegura de cumplir con las pautas de Google Play y utiliza firmas digitales sólidas en cualquier código que descargue y ejecute.