NDK ImGui Instrumentación es una aplicación Android nativa que demuestra cómo construir interfaces de depuración y herramientas de instrumentación in-app combinando Android NDK, Dear ImGui y OpenGL ES 3 sobre NativeActivity. El proyecto integra, en un solo binario, los principales subsistemas que suelen requerirse en aplicaciones móviles avanzadas (cámara, audio, sensores, red, almacenamiento, GPS, notificaciones y diagnóstico) y los expone a través de paneles ImGui interactivos. Está pensado como base de trabajo para prototipos, herramientas internas, motores ligeros y aplicaciones que necesiten control directo sobre el hardware del dispositivo.
El nombre técnico del módulo Gradle sigue siendo
NdkImguiPmv(carpetandk-imgui-pmv/) por compatibilidad con la base de código existente; NDK ImGui Instrumentación es la marca/identidad pública del proyecto.
Haz clic sobre cualquier captura para abrirla en tamaño completo.
- UI nativa con Dear ImGui sobre OpenGL ES 3 / EGL, renderizada por
NativeActivity(sin layouts XML). - Backend gráfico propio (
graphics_egl.cpp) con inicialización de contexto EGL, swap-buffers y manejo de superficie. - Cámara2 NDK completa (
camera_ndk.cpp,camera_preview_renderer.cpp,camera_gl_external.cpp):- Enumeración de cámaras y metadatos (lens-facing, orientación del sensor).
- Camino CPU (lectura de planos YUV/RAW) y camino GPU (interop vía
AHardwareBuffer+EGLImage+ textura externa OES). - Sesión de captura con request repetitivo, vista previa con corrección de aspecto, rotación y flip automáticos.
- Persistencia de configuración de cámara (
camera_config_ndk.cpp).
- Audio AAudio (
audio_ndk.cpp) con stream de salida (tono sintetizado configurable en frecuencia/ganancia) y stream de entrada con medición de pico. - Sensores NDK (
sensors_ndk.cpp): acelerómetro, giroscopio, magnetómetro y rotation-vector con bombeo de eventos en el looper principal. - Red TCP/sockets (
network_ndk.cpp) con prueba de conectividad host:puerto y timeout configurable. - Almacenamiento interno y assets (
files_ndk.cpp,assets_ndk.cpp) con lectura/escritura de archivos y consumo delassets/config.json. - Configuración persistente (
config_ndk.cpp) con perfiles guardables. - Puente Kotlin <-> NDK (
AndroidBridgeActivity.kt+android_bridge_jni.cpp) que expone desde la JVM:- Solicitud y snapshot de permisos en runtime (cámara, audio, ubicación, notificaciones,
BATTERY_STATS). - GPS en vivo (
GPS_PROVIDER+NETWORK_PROVIDER) con eventos hacia C++. - Notificaciones de prueba con creación de canal en Android 8+.
- Diagnóstico del dispositivo (batería, conectividad WiFi/celular, validación de red, rotación de display).
- Solicitud y snapshot de permisos en runtime (cámara, audio, ubicación, notificaciones,
- Sistema de logging unificado (
app_log.cpp) visible en un panel ImGui dedicado, además de__android_log_print. - Multi-vista con paneles para System, Files, Assets, Network, Config, Logs, Audio, Sensors, Diagnostics, Android Bridge, Android Product y Camera.
| Capa | Tecnología |
|---|---|
| Lenguajes | C++17, Kotlin |
| UI | Dear ImGui (backends imgui_impl_android + imgui_impl_opengl3) |
| Gráficos | OpenGL ES 3 + EGL |
| Build | Gradle (AGP 8.13.2), Kotlin 2.2.20, CMake 3.22.1 |
| Plataforma | Android NDK, NativeActivity, native_app_glue |
| Cámara | Camera2 NDK (camera2ndk, mediandk) + AHardwareBuffer + EGLImage |
| Audio | AAudio (aaudio) |
| ABI | arm64-v8a |
| compileSdk / targetSdk / minSdk | 35 / 35 / 26 |
ndk-imgui-pmv/
├── build.gradle # Configuración raíz (AGP + Kotlin)
├── settings.gradle # rootProject.name = "NdkImguiPmv"
└── app/
├── build.gradle # Configuración del módulo app + CMake + NDK ABI
└── src/main/
├── AndroidManifest.xml # Permisos y NativeActivity
├── assets/
│ └── config.json # Configuración de modulos
├── java/com/example/ndkimguipmv/
│ └── AndroidBridgeActivity.kt# Puente Kotlin con JNI (permisos, GPS, etc.)
└── cpp/
├── CMakeLists.txt # Compilación nativa + ImGui
├── main.cpp # Punto de entrada android_main + bucle principal
├── app_state.h # Estado global de la app
├── graphics_egl.* # Inicialización EGL/GLES3
├── ui_imgui.* # Capa Dear ImGui (init, frame, paneles)
├── camera_ndk.* # Camera2 NDK (sesion, captura, planos)
├── camera_gl_external.* # Interop GPU (HardwareBuffer/EGLImage/OES)
├── camera_preview_renderer.* # Vista previa con corrección/rotación/flip
├── camera_config_ndk.* # Persistencia de configuración de cámara
├── audio_ndk.* # Streams AAudio in/out
├── sensors_ndk.* # Sensores NDK
├── network_ndk.* # Pruebas de red TCP
├── files_ndk.* # I/O en almacenamiento interno
├── assets_ndk.* # Lectura del AssetManager
├── config_ndk.* # Persistencia de perfiles
├── android_bridge_jni.* # Implementacion JNI (callbacks desde Kotlin)
├── app_log.* # Logging unificado (UI + logcat)
├── platform_log.h # Macros LOGI/LOGE
└── imgui/ # Fuentes de Dear ImGui (debes proveerlas)
Nota sobre Dear ImGui: las fuentes de Dear ImGui (
imgui.cpp,imgui_draw.cpp,imgui_tables.cpp,imgui_widgets.cpp,imgui_demo.cppy los backendsimgui_impl_android.cpp/imgui_impl_opengl3.cpp) deben colocarse enapp/src/main/cpp/imgui/(con la subcarpetabackends/). Puedes copiarlas o agregarlas como submódulo desde el repositorio oficial de ocornut/imgui.
INTERNET, ACCESS_NETWORK_STATE, CAMERA, RECORD_AUDIO, ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION, POST_NOTIFICATIONS y BATTERY_STATS (este último se reporta como NOT_REQUESTABLE y se gestiona vía settings del sistema).
- Android Studio (recomendado: Hedgehog/Iguana o superior).
- Android NDK y CMake 3.22.1+ instalados desde el SDK Manager.
- Un dispositivo o emulador
arm64-v8acon Android 8.0 (API 26) o superior. - Soporte de OpenGL ES 3.0.
- (Opcional) Permisos de cámara, micrófono y ubicación concedidos para probar los paneles correspondientes.
-
Clona el repositorio:
git clone <url-del-repo> cd ndk-imgui-pmv
-
Coloca las fuentes de Dear ImGui en
app/src/main/cpp/imgui/(incluyendo el directoriobackends/). -
Ajusta
local.propertiescon la ruta de tu Android SDK:sdk.dir=C:/Users/<tu-usuario>/AppData/Local/Android/Sdk -
Compila e instala con Gradle:
./gradlew :app:installDebug
O abre el proyecto en Android Studio y ejecútalo con
Run > Run 'app'. -
Concede los permisos en el primer arranque desde el panel Android Bridge.
Permite habilitar/deshabilitar módulos al inicializar:
{
"app": "NDK ImGui PMV",
"sprint": "2.1",
"modules": {
"internal_files": true,
"assets": true,
"network": false,
"audio": false,
"camera": false
}
}- Herramientas internas y de QA para apps Android que requieran depuración avanzada del hardware.
- Prototipos de visión por computadora / AR que necesiten acceso de baja latencia a la cámara con interop GPU.
- Aplicaciones de telemetría móvil (sensores, GPS, batería, red) con UI rica y bajo overhead.
- Motores ligeros y demos gráficas que ya usan ImGui en escritorio y quieran portar su panel de control a Android.
- Bases para aplicaciones IoT móviles que combinen sensores, audio y red sobre NDK.
- Material educativo sobre integración Kotlin-JNI-NDK y arquitectura con
NativeActivity.
Estado actual: [work in progress]
- Nombre: Luis Eduardo Cochachi Chamorro
- Profesión: Desarrollador Full Stack
- Contacto: luis.cochachi.eng@gmail.com
- Linkedin: Mi perfil de LinkedIn
- ORCID: 0009-0007-7214-9137
¿Necesitas asesoría, guía técnica o la elaboración de productos personalizados (personales o comerciales) sobre Android NDK, Dear ImGui, integración de Camera2/AAudio/sensores, arquitecturas C++/Kotlin/JNI o aplicaciones nativas de alto rendimiento? No dudes en ponerte en contacto.
También recibo con gusto:
- Invitaciones para evaluar la factibilidad técnica de proyectos (descubrimiento, análisis de viabilidad, estimaciones, proof of concept).
- Invitaciones para participar en licitaciones públicas o privadas y concursos de empresas, ya sea como contratista principal, subcontratista, consultor técnico o miembro de equipo evaluador.
- Proyectos personales, medianos y complejos — desde prototipos y MVPs hasta sistemas de mediana y alta complejidad, integraciones multi-plataforma y desarrollos a medida.
Canales de contacto:
- Correo: luis.cochachi.eng@gmail.com
- LinkedIn: Mi perfil de LinkedIn
Estoy disponible para colaboraciones, mentorías, freelance, contratos por proyecto y desarrollos a medida.
¡Hola! Si disfrutas del proyecto y te gustaría apoyarlo de una manera diferente, puedes invitarme un café ☕ haciendo una donación. Esto me ayuda a seguir dedicando mi tiempo a mejorar el código y crear nuevas funcionalidades.
Soy un apasionado del desarrollo de software y siempre estoy buscando nuevas formas de aprender y compartir mis conocimientos. Cada contribución, por pequeña que sea, significa mucho para mí y me motiva a seguir adelante.
Puedes invitarme un café a través de Paypal: https://www.paypal.com/paypalme/luiscochachichamorro
¡Gracias por tu apoyo! 🚀
Copyright (C) 2024 Luis Eduardo Cochachi Chamorro
Este proyecto se distribuye bajo la licencia GNU General Public License versión 3 o cualquier versión posterior (GPLv3), con la excepción de vinculación comercial. Esto significa que puedes utilizar, modificar y distribuir este código libremente, incluso con fines comerciales, pero cualquier aplicación que combine este código con otros componentes debe ser liberada bajo la GPLv3.


























