Popen en android NDK
¿Popen no es compatible con android NDK?
Leí esta página y me pregunto si esto es cierto
- Configuración de la variable Cygwin Path para encontrar Android NDK
- Señal fatal 11 (SIGSEGV) código = 2 en genymotion emulador no utilizando NDK
- No se puede escribir en el registro ARM R4: feature o bug?
- Qt5 para Android: incompatible ABI
- ¿Por qué exec_elf.h fue eliminado del Android NDK?
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?
- ¿Biblioteca de sonido nativa en Android que puede cambiar de tono?
- No se puede localizar el símbolo 'tcgetattr' referido por "libcrypto.so"
- ¿Utilizar un archivo mapeado en memoria como un archivo de intercambio?
- C ++ 11 funciones cmath no en el espacio de nombres std para android NDK w / gcc-4.8 o clang 3.4
- NFC API para Android NDK
- Ndk-build opción NDK_APP_APPLICATION_MK no funciona?
- Integrar MuPDF Reader en una aplicación
- Los tipos intrínsecos NEON funcionan en C pero arrojan error de argumentos no válidos en C ++
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.