いくつかの iperf コマンドを実行できる Android アプリケーションを作成しています。そのために、IPerf C プロジェクトのバージョン 3 のソース コードを入手し、これらのコマンドを使用してクロス コンパイルします。
> make clean
> ./configure --host=arm-linux --prefix=/home/laboPC/Downloads CC=arm-linux-androideabi-gcc CXX=arm-linux-androideabi-g++ CFLAGS="-static" CXXFLAGS="-static" LDFLAGS="-pie -fuse-ld=bfd"
> make
クロスコンパイル後、Android プロジェクトの assets フォルダーに配置したバイナリ ファイルを取得しました。
Android から IPerf を使用するために、次の方法でバイナリのコピーを作成します。
private String binariePath = context.getApplicationInfo().dataDir + "/iperf3";
private void setupBinaries(){
InputStream in = context.getResources().openRawResource(R.raw.iperf3);
OutputStream out = new FileOutputStream(binariePath);
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.flush();
out.close();
Runtime.getRuntime().exec("chmod 751 " + binariePath);
}
次に、Runtime オブジェクトを使用して、次のような iperf コマンドを実行します。
public String runClient (String server, String argument) {
try {
setupBinaries();
process = Runtime.getRuntime().exec(binariePath + " -c " + server + " " + argument);
BufferedReader reader = new BufferedReader( new InputStreamReader(process.getInputStream()));
final StringBuilder result = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
result.append(line + "\n");
}
reader.close();
process.destroy();
return result.toString();
} catch (IOException e) {
Log.d("IPERF", e.getLocalizedMessage());
return e.getLocalizedMessage();
}
}
Android 7.0 を除いて、すべて正常に動作します。Android 7 の Nexus 5X でアプリを実行すると、iperf コマンドが実行されていないようで、result
変数が空です。
Android 7 で Runtime.exec() が正常に動作し、バイナリがアプリ データ ディレクトリに正しくコピーされていることを確認しました。
私のプロセスで何が問題なのか、誰もが知っていますか? IPerf プロジェクトをコンパイルするためのコマンドは正しいですか?
ご協力いただきありがとうございます。
編集
次のスレッドで、Android 6.0 以降が -fPIC オプションでコンパイルされたバイナリを実行できることがわかりました。
android ndk: -fPIC と -pie は相互に排他的ですか?
独立した実行可能ファイルと Android Lollipop を配置する
そこで、次のコマンド ラインを使用して C プロジェクトをコンパイルしようとしました。
./configure --host=arm-linux --prefix=/home/laboPC/Downloads CC=arm-linux-androideabi-gcc CXX=arm-linux-androideabi-g++ CFLAGS="-static -fPIC" CXXFLAGS="- static" LDFLAGS="-pie -fuse-ld=bfd"
コマンドラインに何か問題があると思いますが、何が原因かわかりません。コマンドラインで何が間違っているかを特定するのを手伝ってくれる人はいますか?