5 votos

¿Las llamadas a la interfaz nativa de Java en aplicaciones de Android se ejecutan dentro de Dalvik VM?

Leí que las aplicaciones a veces acceden a las bibliotecas nativas con fines de optimización a través de la interfaz nativa de Java.

Según tengo entendido, JNI solo proporciona envoltorios de java alrededor de las bibliotecas / binarios de c / c ++ que se escriben más cerca del hardware, por lo tanto, más rápido y más eficiente.

Pero, ¿cómo proporciona un aumento de rendimiento? ¿No se llama a las API JNI a través de Dalvik VM, por lo que no se ejecutan de forma nativa? Todavía se ejecutan dentro de una VM, por lo que no debería haber ninguna diferencia.

7voto

Andy Brudtkuhl Puntos 1714

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.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X