Creo ver la fuente de la confusión. Dalvik VM no es una máquina virtual de la misma manera como VMware o Virtualbox. En que tipo de máquina virtual, VMware (o lo que sea) es pretender ser el de todo el equipo. Cada operación tiene que ir a través de la máquina virtual, se debe impedir el acceso al hardware real, y si lo hace acceder al hardware real, VMware tiene que hacer algún trabajo de pretender ser el hardware real, dan el resultado para el sistema operativo, y tiene el OS dará el resultado de la aplicación. Hay toda una copia del sistema operativo que se ejecuta dentro de la VM, por lo que es una aplicación en un sistema operativo de VMware, que es en sí mismo una aplicación que se ejecuta en un sistema operativo, que es, a continuación, en el hardware real.
Java y (por extensión) Dalvik VM no es así. Es más como una abstracción de la máquina real. El hardware real no se oculta de la aplicación, y no se trata de una copia adicional del SO no.
Una aplicación Java es sólo un proceso en el teléfono como un no-aplicación de Java. Cuando una aplicación Java que se hace una llamada a una función a través de JNI, Dalvik tiene que hacer una pequeña cantidad de contabilidad para pasar los objetos utilizados en la llamada a la función en el código nativo, y, a continuación, el código nativo sólo se ejecuta en el proceso, sin VM implicado en el asunto. Luego hay un poco más de teneduría de libros para obtener el resultado de vuelta en el código Java.
El código dentro de la JNI de la llamada es tan rápido como cualquier código nativo en un proceso donde no hay Java. La única sobrecarga es el libro de mantenimiento en la entrada y salida de la llamada.