programacion - ¿Es posible depurar C/C++ en Android Studio?
manual de programacion android pdf (6)
Estoy escribiendo una aplicación para Android que incluye código C / C ++ que se compila junto con el código Java. Mi aplicación se bloquea durante la ejecución del código nativo.
¿Hay alguna forma de pasar por la fuente de Android C / C ++ e inspeccionar las variables, ya que es posible con la fuente de Java?
No necesariamente estoy buscando una manera de recorrer la fuente desde Android Studio . Esa es obviamente la solución ideal, sin embargo, si necesito usar una herramienta externa después de iniciar la aplicación desde Studio, está bien. Quiero poder recorrer la ejecución línea por línea e inspeccionar las variables.
Android Studio 1.0.2
Android NDK r10d
Edición: Partiendo de la respuesta inmediata de "Usar Eclipse con el complemento ADT", permítame agregar más requisitos.
Este proyecto comenzó como un proyecto ADT de Eclipse. Sin embargo, ahora he migrado a Android Studio. Mi proyecto ahora está construido usando Gradle, y la estructura de directorio de mi proyecto refleja esto. Estoy dispuesto a usar Eclipse; No estoy dispuesto a cambiar la estructura de mi proyecto para volver a Eclipse desde Android Studio. Si hay una manera de abrir el proyecto de Android Studio en Eclipse y depurarlo de esa manera, por favor explique el proceso.
¡sí! Es posible depurar el código nativo en Android Studio. A partir de las actualizaciones, el soporte de Android Studio 2.2+ en herramientas integradas para depurar código nativo.
A partir de la versión 1.3+, Vista previa de Android Studio es compatible con la depuración de C ++, citando Vista previa y herramientas de Android M Developer
Lo más notable es una característica muy solicitada de nuestros desarrolladores de juegos y NDK de Android: edición y depuración de código para código C / C ++. Basado en la plataforma JetBrains Clion, el complemento NDK de Android Studio proporciona características tales como refactorización y finalización de código para el código C / C ++ junto con su código Java. El soporte de código Java y C / C ++ se integra en una experiencia de desarrollo gratuita para los desarrolladores de aplicaciones de Android.
Con Android Studio 1.4 de tools.android.com, la depuración es posible. Cuando abres / creas un proyecto con código C ++ [jni], Android studio creará una nueva configuración, algo así como $ (nombre_módulo) -nativo
Seleccionaría esta configuración, sincronizaría gradle, compilaría, establecería un punto de interrupción, etc. y la ejecutaría con Android Studio. Después de una larga espera, mi depurador está conectado, la aplicación está dañada en [Creo que también podría establecer un punto de interrupción en este momento]; esta ruptura no está en mis puntos de ruptura establecidos, la dejé entrar en Android Studio y mi punto de ruptura fue alcanzado. Espero que esto ayude
Algunas muestras se supone que funcionan con el depurador de Android
No es, no es, no está funcionando muy bien.
hello-jni ha fallado con:
Starting LLDB server: run-as com.example.sample
/data/data/com.example.sample/lldb/bin/start_lldb_server.sh
/data/data/com.example.sample/lldb
/data/data/com.example.sample/lldb/tmp/platform.port1442695333842 "lldb
process:gdb-remote packets"
Error while launching debug server on device:
com.android.tools.ndk.run.DebuggerContext$StartServerException:
java.lang.IllegalStateException: Failed to read platform port
/data/data/com.example.sample/lldb/tmp/platform.port1442695333842
Estoy usando 1.4RC1
compileSdkVersion 23
buildToolsVersion "23.0.1"
Y la configuración de ejecución "nativa de la aplicación" @Gerry mencionó. Está casi allí, pero no puedo encontrar rastro de un directorio lldb
en la carpeta de datos privados de mi aplicación. Encuentro un gdbserver de 400kb en el directorio lib
enlazado desde allí, con mi propio *.so
. Desafortunadamente, la opción para depurar con gdb en lugar de lldb ha ido con la actualización de 1.3 a 1.4. NDK 10e envía un binario gdbserver de 400 kb en ndk/prebuilt/android-arm/gdbserver
que es (supongo). El 15 de septiembre se actualizó el gdb debug howto https://github.com/mapbox/mapbox-gl-native/wiki/Android-debugging-with-remote-GDB . Esto es más difícil que logcat depurando IMO, pero es un tema actual, lamento ser tan negativo, pero no creo que lldb realmente funcione todavía.
He corrido hola-jni y he llegado a la misma conclusión.
Entonces, en respuesta a su pregunta, todavía no es posible depurar C / C ++ en Android Studio. Lo siento, esta no fue la respuesta que esperaba y espero que se demuestre lo contrario con pruebas concluyentes de lo contrario, pero aquí mismo, ahora mismo, ¡no hay oportunidad!
ACTUALIZACIÓN He planteado un issue en el que me dieron una solución para un teléfono.
ACTUALIZACIÓN2 Demasiado pronto para decirlo, es experimental, después de todo, pero ocasionalmente no puedo conectarme, a menudo, si no siempre, me estoy quedando fuera de lugar en pasos y puntos de interrupción con valores de parámetros sin sentido. Acabo de establecer un punto de interrupción condicional que no se activó, pero el logcat muestra que debería hacerlo. Inicialmente asumí que era mi error lógico, pero va más allá.
Simplemente alcanzar puntos de interrupción es muy útil, pero aún falta un millón de millas para la depuración de Java o la depuración de Vis Studio C ++.
ACTUALIZACIÓN3 Volvió a la versión estable 1.3.1 ya que la versión del canal de Canaray se estaba deteniendo para ir al baño cada vez que presionaba una tecla. Mientras que la compilación de depuración nativa se inicia al menos con mi teléfono "fijo", no se alcanzan puntos de interrupción ni siquiera en hellojni, o una versión ligeramente extendida para dar más oportunidad. Estoy acostumbrado a logcat ahora, pero he tenido mejores experiencias de eliminación de errores con Android, NDK y Eclipse. Una solución más elaborada también es más fácil de romper, pero al menos funciona .
Sí , Android Studio admite la depuración de C ++ al menos con Android studio 1.5.1 y android-ndk-r10e.
En los viejos tiempos, tendrá que escribir make files Android.mk y Application.mk para construir el código C ++ en Android Studio. No los necesitas más. Mientras los coloques debajo de la carpeta jni , gradle podrá recogerlos y compilarlos. Deberías ver algo como lo siguiente:
Y también te permite establecer un punto de ruptura y depurarlo.
Debe seguir este tutorial paso a paso y aprender más sobre él. Y lea más sobre la documentación here . He cargado un ejemplo completo de trabajo para que pueda descargarlo y probarlo en GitHub .
[ACTUALIZAR]
A partir de julio de 2015, Android Studio SÍ soporta NDK.
Puedes aprender más sobre esto en este enlace .
[OLD] NDK aún no es compatible con Android Studio.
Cuando tenemos que lidiar con NDK, la única solución es utilizar Eclipse.
EDITAR
Básicamente, mantenemos el proyecto Eclipse con la característica NDK (mapa en nuestro caso) y el proyecto Gradle con otras características (que no son mapas). Entonces, todo lo que se debe hacer con NDK, lo hacemos en Eclipse y luego incluimos cambios en el proyecto Gradle.
Para ser más precisos, dentro del directorio /src/main/
creamos otro directorio llamado jniLibs
y jniLibs
el archivo *.so
jniLibs
compilado dentro de las carpetas específicas de la arquitectura (armeabi-v7a, armeabi, x86 ...). Luego, en la clase principal del proyecto Gradle, simplemente se agrega una línea
static {
System.loadLibrary("OurNDKLibName");
}
Puede agregar esta línea solo una vez por proyecto. Tal vez me equivoque, pero no tuvimos ningún problema para hacerlo.