Popen en android NDK

¿Popen no es compatible con android NDK?

Leí esta página y me pregunto si esto es cierto

Lo mismo es posible con POSIX popen (), pero actualmente no es compatible con bionic, por lo que no puedes usarlo en Android JNI. En su lugar, probablemente puede utilizar el sistema () y canalizar la salida a un archivo y, a continuación, leer ese archivo después. Parece que el enfoque de Java será más limpio si va a hacer la representación en Java.

Pero también leí a alguien que sugiere usar popen. También lo intenté yo mismo, pero en algún momento mi aplicación se bloquea y no sé por qué.

¿Es seguro popen para usar en android ndk?

Creo que depende de la versión del NDK que esté usando

También buscando en el árbol de fuente de pan de jengibre para biónicos encontré una implementación de popen. La implementación podría no ser 100% posix de libc correcta, pero es al menos funcional hasta cierto punto.

Mediante NDK v6, el ejemplo siguiente se compila sin ningún problema y se ejecuta en mi dispositivo Android.

#include <stdio.h> #include <stdlib.h> int main() { FILE *fpipe; char *command="/system/bin/ps"; char line[256]; if ( !(fpipe = (FILE*)popen(command,"r")) ) exit(1) while ( fgets( line, sizeof line, fpipe)) { puts(line); } pclose(fpipe); } 

UPDATE: Parece que popen en las versiones pre ICS utilizado vfork () en lugar de fork (), y los vfork () se sabe que causan corrupción de la pila.

Así que desde ICS en adelante popen debe ser guardar para usar, pero en las versiones anteriores de Android está disponible, pero verry buggy.

De hecho, popen() no funcionará en Android. Como se describe en la descripción de GLIBC , cualquier sistema operativo UNIX necesita una biblioteca C para realizar todas las llamadas al sistema. Debido a que Android se basa en Linux, necesita que se implemente dicha biblioteca, pero debido a que es un pequeño sistema operativo móvil, Google decidió escribir una versión "lite" de libc llamada biónica. Esta biblioteca no incluye popen() , por lo tanto no se puede usar. Hay una descripción de la biblioteca biónica en la documentación NDK que vive dentro de su directorio NDK (por alguna razón no está en línea). Espero que esto ayude.

  • ¿Cómo puede el código nativo de Android dirigirse a múltiples tipos de procesadores?
  • Depuración código nativo en Android en el * dispositivo * (no emulador)
  • Bitmap setPixels perderá el canal alfa cuando el fondo sea negro
  • Configurar una aplicación Qt5 5.7 para Android con CMake
  • Ejecución de ndk-gdb con error de paquete no encontrado en el teléfono Motorola
  • La biblioteca 'javacv-android-arm.jar' contiene bibliotecas nativas que no se ejecutan en el dispositivo
  • Creación de una función personalizada en sqlite3 en android
  • Casting un tipo largo de C ++ a un jlong ​​de JNI
  • Android.mk wilcard extra 'jni' en el camino?
  • Cómo construir un solo APK con Android NDK y Gradle
  • Acelerómetro (acceso rápido) mediante NativeActivity NDK
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.