2012-01-18 103 views
4

是不是由android NDK支持popen?在Android上的popen NDK

我读this page,不知道这是不是真的

同样是可能的POSIX的popen(),但它不是目前由 仿生的支持,所以你不能使用Android中JNI。相反,您可以使用system()并将输出传输到文件,然后 之后再读取该文件。看起来像Java方法将是 更清洁,如果你将在Java中进行渲染。

但我也看过有人建议使用popen。我也自己尝试过,但有时我的应用崩溃了,我不知道为什么。

是安全使用android ndk popen吗?

回答

7

我认为这取决于你所使用的NDK版本

另外在姜饼源树仿生我没有找到POPEN的实现期待。 该实现可能不是100%正确的libc posix,但它在某种程度上至少起作用。

使用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方法上()中使用了vfork预ICS版本,而不是叉(),以及那些vfork的()已知会导致堆栈损坏。

所以从ICS开始,popen应该保存使用,但是在早期的android版本中,它是可用的,但是很有挑战性。

+0

感谢您的更新:) – kuchi

4

确实,popen()在Android上不起作用。正如GLIBC description所述,任何UNIX操作系统都需要一个C库来进行所有系统调用。这些包括线程内存分配,文件处理等。由于Android基于Linux,它需要实现这样的库,但由于它是一个小型的移动操作系统,谷歌决定编写一个名为bionic的libc的“精简版”。这个库不包括popen(),因此你不能使用它。在NDK文档中有一个关于仿生库的描述(它出于某种原因不在线)。希望这可以帮助。

+0

谢谢。我只是想知道它如何在我的示例应用程序上工作?我相信如果它不包括在内,那么它根本不应该工作。 – kuchi

+0

正确,在Android上完全没有用。 – Phonon

+1

是的,这是正确的。虽然popen()函数在Android上可用,但由于使用了vfork()方法,它实际上会损坏堆栈。 –