¿Es posible depurar C / C ++ en Android Studio?
Estoy escribiendo una aplicación de 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 una manera de pasar a través de Android C / C + + fuente e inspeccionar las variables como es posible con la fuente de Java?
- Enviar un objeto personalizado mediante la carpeta nativa de Android
- ¿Cómo mantener la pantalla encendida en Qt para Android?
- ¿Cómo crear una biblioteca nativa de C ++ en Android?
- gcc disable -Wall flag para archivos / carpetas específicos
- Cómo compilar un programa C para Genymotion (Android x86)
No necesariamente estoy buscando una forma de paso a través de la fuente de Android Studio . Ésta es obviamente la solución ideal, sin embargo, si necesito utilizar una herramienta externa después de iniciar la aplicación de Studio, está bien. Quiero ser capaz de pasar a través de la línea de ejecución por línea e inspeccionar las variables.
Android Studio 1.0.2
Android NDK r10d
Edit: A partir de la respuesta inmediata de, "Utilizar Eclipse con ADT plugin", permítanme añadir más requisitos.
Este proyecto comenzó como un proyecto Eclipse ADT. Sin embargo, ahora he migrado a Android Studio. Mi proyecto ahora se construye utilizando Gradle, y la estructura de mi directorio de proyectos refleja esto. Estoy dispuesto a usar Eclipse; No estoy dispuesto a cambiar mi estructura de proyecto para volver a Eclipse desde Android Studio. Si hay una forma de abrir el proyecto de Android Studio en Eclipse y depurarlo de esa manera, explíquenos el proceso.
- Utilizar una clase simple de C ++ en Android NDK
- Uso de mi propia biblioteca compartida precompuesta en un proyecto de Android NDK
- Métodos genéricos estáticos en .Net vs Java
- Cambiar la prioridad de subprocesos nativos en Android en c / c ++
- Escribir aplicaciones en C o C ++ para Android?
- ¿Cómo llamar a la función con callbacks en Java como lo hago en C #?
- Tabla de referencia local de JNI de Android Expand
- Una biblioteca para compresión / descompresión de vídeo sin pérdidas / bajo nivel de plataforma cruzada (C ++ / Android)
A partir de la versión 1.3+ Preview Android Studio admite la depuración de C ++, citando Android M Developer Preview & Tools :
Lo más notable es una característica muy solicitada de nuestros desarrolladores de Android NDK y juegos: código de edición y depuración de código C / C ++. Basado en la plataforma JetBrains Clion, el complemento Android Studio NDK ofrece funciones como la refactorización y la finalización del código C / C ++ junto con el código Java. El soporte de código Java y C / C ++ está integrado en una experiencia de desarrollo gratuita para los desarrolladores de aplicaciones para Android.
[ACTUALIZAR]
A partir de julio de 2015, Android Studio DOES apoya NDK.
Puede obtener más información al respecto en este enlace .
[OLD] NDK todavía no es compatible con Android Studio.
Cuando tenemos que lidiar con NDK, la única solución es usar Eclipse.
EDITAR
Básicamente, mantenemos el proyecto Eclipse con la función NDK (mapa en nuestro caso) y el proyecto Gradle con otras características (no mapa). Así que todo lo que tiene que hacerse 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 ponemos 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 agregó una línea
static { System.loadLibrary("OurNDKLibName"); }
Puede agregar esta línea sólo una vez por proyecto. Tal vez me equivoque, pero no tuvimos ningún problema para hacerlo.
No es no era no está funcionando muy bien.
Hello-jni falló 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 el "app-native" ejecutar la configuración @ Gerry mencionado. Es casi allí, pero no puedo encontrar ningún rastro de un directorio lldb
en la carpeta de datos privados de mi aplicación. Encontré un gdbserver de 400kb en el directorio lib
enlazado desde allí, con mi propio *.so
además. 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 400kb en ndk\prebuilt\android-arm\gdbserver
que es (supongo). El 15 de septiembre se actualizó el archivo de depuración de gdb https://github.com/mapbox/mapbox-gl-native/wiki/Android-debugging-with-remote-GDB . Esto es más difícil que el logcat de depuración IMO, pero un tema actual, lo siento por ser tan negativo, pero no creo que lldb realmente funciona todavía.
He dirigido hello-jni y llegó a la misma conclusión.
Así que 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 pruebe mal con pruebas concluyentes en contrario, pero justo aquí, ahora mismo, no hay oportunidad!
UPDATE Me planteó un problema en el que se me dio una solución para un teléfono.
UPDATE2 Demasiado pronto para decirlo, es experimental después de todo, pero ocasionalmente fallo en conectarme, a menudo, si no siempre, saliendo del orden de 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 disparó, pero el logcat muestra que debería. Inicialmente asumí que era mi error lógico, pero va más profundo.
Simplemente golpear puntos de interrupción es muy útil, pero todavía está a un millón de millas de la depuración de Java, o Vis Studio C + + de depuración.
UPDATE3 Regresó a la versión estable 1.3.1 ya que la versión del canal canaray hacía una pausa para una pausa de baño cada pulsación de tecla. Mientras la compilación de depuración nativa al menos se lanza con mi teléfono "fijo", no se producen puntos de interrupción incluso en hellojni, o una versión ligeramente extendida para dar más oportunidades. Estoy acostumbrado a logcat ahora, pero he tenido mejores experiencias degbugging 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ás que escribir make files Android.mk y Application.mk para construir el código C ++ en Android Studio. Ya no los necesitas. Siempre que los coloques en la carpeta jni , gradle podrá recogerlo y compilarlo. Debería ver algo como lo siguiente:
Y también le permiten establecer punto de quiebre y depurarlo.
Debe seguir este tutorial paso a paso y aprender más al respecto. Y lea más sobre la documentación aquí . He subido un ejemplo de trabajo completo para que pueda descargarlo y probarlo en GitHub .
Con Android Studio 1.4 de tools.android.com, la depuración es posible. Cuando abra / cree un proyecto con código C ++ [jni], Android studio creará una nueva configuración, algo como $ (nombre_módulo) -nativo
Yo seleccionaría esta configuración, sincronizar gradle, construir, establecer puntos de ruptura, etc y ejecutarlo con Android Studio. Después de una larga espera, mi depurador está conectado, la aplicación está roto en [Creo que también podría establecer el punto de interrupción en este momento]; Esta ruptura no está en mis puntos de rotura del sistema, lo dejé ir en androide estudio y mi punto de interrupción se golpea. Espero que esto ayude
Se supone que algunas muestras funcionan con el depurador de Android
¡sí! Es posible depurar código nativo en android studio. A partir de las actualizaciones de Android Studio 2.2 + soporte en herramientas integradas para la depuración de código nativo.
- Interrumpe el diálogo enBackPressed ()?
- Cómo evitar "Actualizar carpetas externas" en el desarrollo de Android en Eclipse