2012-01-18 24 views
4

android NDKではpopenはサポートされていませんか?これは同じでPOSIXのpopenの()で可能ですpopen on android NDK

trueの場合

は私が this pageと思って読んでいますが、AndroidのJNIでそれを使用することはできませんので、それは、現在バイオニックでサポートされて ではありません。代わりに、 はおそらくsystem()を使用して出力をファイルにパイプし、その後 そのファイルを読み取ることができます。あなたはJavaでレンダリングを行う場合は、Javaのアプローチは クリーナーになるように見えます。

しかし、私はpopenを使うことを提案している人も読んでいます。私もそれを自分で試してみましたが、いつか私のアプリがクラッシュし、なぜか分からないのです。

android ndkで使用するのは安全ですか?

答えて

7

私はそれはあなたがまた、私はpopenの実装のを見つけたバイオニックのためのジンジャーブレッドソースツリーに探して

を使用しているNDKのバージョンに依存だと思います。 実装はlibcの100%posixではないかもしれませんが、少なくともある程度は機能しています。

NDK v6を使用すると、次の例は問題なくコンパイルされ、アンドロイドデバイスで実行されます。

#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: 代わりフォークの)(前のICSバージョン使用のvforkにはpopenよりも思える()、及びそれらのvfork()は、スタックの破損を引き起こすことが知られています。

ICS以降では、popenは使用するために保存する必要がありますが、以前のAndroidバージョンでは利用可能ですがverry buggyです。

+0

更新ありがとうございます:) – kuchi

4

実際、popen()はAndroidでは動作しません。 GLIBC descriptionのように、すべてのUNIXオペレーティングシステムでは、すべてのシステムコールを行うためにCライブラリが必要です。 AndroidにはLinuxが搭載されているため、このようなライブラリが実装されている必要がありますが、モバイルOSが小さいため、Googleはbionicというlibcの「ライトバージョン」を作成することにしました。このライブラリにはpopen()が含まれていないため、使用できません。あなたのNDKディレクトリ内に存在するNDKのドキュメントには、何らかの理由でオンラインではないバイオニックライブラリの説明があります。お役に立てれば。

+0

ありがとうございました。私はちょうどそれが私のサンプルアプリケーションで動作するようになるのだろうか?私はそれが含まれていない場合、それは全く動作しないはずだと思う。 – kuchi

+0

正しいですが、Androidではまったく動作しません。 – Phonon

+1

はい、これは正しいです。 popen()関数はAndroid上で利用可能ですが、実際にはvfork()アプローチが使用されているのでスタックを破損します。 –