2012-01-18 3 views
4

Есть ли popen не поддерживается android NDK?popen on android NDK

Я прочитал this page и интересно, если это правда

То же самое можно с POSIX POPEN(), но в настоящее время не поддерживается бионический, так что вы не можете использовать это в Android JNI. Вместо этого вы, , вероятно, можете использовать систему() и передать вывод в файл, а затем после этого прочитать этот файл. Похоже, что подход Java будет чище, если вы будете делать рендеринг в Java.

Но я также читал кого-то, предлагающего использовать popen. Я также пробовал это сам, но иногда мое приложение падает, и я не знаю, почему.

Является ли всплывающее безопасным использование в android ndk?

ответ

7

Я думаю, что это зависит от того, какая версия NDK вы используете

Кроме того, глядя в дереве исходных пряников для бионических я нашел реализацию POPEN. Реализация может быть не 100% posix libc правильно, но она по крайней мере функциональна до некоторой степени.

Используя NDK v6, следующий пример компилируется без каких-либо проблем, и он запускается на моем устройстве 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: Кажется, чем POPEN на предварительных версиях ICS используемых vfork() вместо вилки(), и те, vfork(), как известно, вызывают повреждение стека.

Итак, с ICS onward popen следует сохранить в использовании, но на более ранних версиях Android он доступен, но верный багги.

+0

Спасибо за обновление :) – kuchi

4

Действительно, popen() не будет работать на Android. Как указано в GLIBC description, любая операционная система UNIX нуждается в библиотеке C для выполнения всех системных вызовов. К ним относятся распределение потоковой памяти, работа с файлами и т. Д. Поскольку Android основан на Linux, ему нужна такая библиотека, но поскольку это небольшая мобильная ОС, Google решил написать «облегченную версию» libc, называемую bionic. Эта библиотека не включает popen(), поэтому вы не можете ее использовать. В документации NDK содержится описание бионической библиотеки, которая живет в вашем каталоге NDK (по какой-то причине она не в сети). Надеюсь это поможет.

+0

Спасибо. Мне просто интересно, почему это работает на моем примере приложения? Я считаю, что если он не включен, то он не должен работать вообще. – kuchi

+0

Правильно, это не будет работать вообще на Android. – Phonon

+1

Да, это правильно. Хотя функция popen() доступна на Android, она фактически искажает стек, поскольку используется метод vfork(). –