Android NDK上的popen

kuc*_*chi 4 android popen android-ndk

Android NDK不支持popen吗?

我读了这页,想知道这是不是真的

POSIX popen()也是如此,但bionic目前不支持它,所以你不能在Android JNI中使用它.相反,您可以使用system()并将输出传递给文件,然后再读取该文件.如果您要在Java中进行渲染,看起来Java方法会更清晰.

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

在Android ndk中使用popen是否安全?

小智 7

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

另外在姜饼源树中寻找仿生物,我确实找到了popen的实现.实现可能不是libc的100%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);
}
Run Code Online (Sandbox Code Playgroud)

更新:看起来比使用vfork()而不是fork()的pre ICS版本,并且已知这些vfork()会导致堆栈损坏.

所以从ICS开始popen应该保存使用,但在早期的Android版本它可用但verry buggy.