поп на андроиде NDK - PullRequest
       1

поп на андроиде NDK

4 голосов
/ 18 января 2012

Попен не поддерживается Android NDK?

Я прочитал эту страницу и задаюсь вопросом, правда ли это

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

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

Безопасно ли использовать popen в Android ndk?

Ответы [ 2 ]

7 голосов
/ 05 апреля 2012

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

Также, просматривая исходное дерево пряников для бионики, я нашел реализацию popen.Реализация может не соответствовать 100% правильному положению 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);
}

ОБНОВЛЕНИЕ: Похоже, что popen на предыдущих версиях ICS использовал vfork () вместо fork (), и эти vfork (), как известно, вызывают повреждение стека.сохранить, чтобы использовать, но в более ранних версиях Android он доступен, но очень глючит.

4 голосов
/ 18 января 2012

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

...