2012-01-18 40 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()方法,它實際上會損壞堆棧。 –