2

いくつかの 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"

コマンドラインに何か問題があると思いますが、何が原因かわかりません。コマンドラインで何が間違っているかを特定するのを手伝ってくれる人はいますか?

4

2 に答える 2

4

あなたの質問を見つけて、Android 用の iperf3 をビルドするのに役立ちましたが、同じ問題に達しました。
Ubuntu リポジトリのビルド ツールチェーンを使用していますか? はいの場合、ビルドされたバイナリは古いバージョンのビルド ツールチェーンを使用しているため、Android 7.0 では動作しません。最新の NDK バージョンでバイナリをビルドする必要があります。(現在は r13b です)

解決方法:
-すべての iperf3 ソースを src フォルダーから jni フォルダーに配置しました
-以下に投稿する Android.mk と Application.mk を他のファイルと共に同じフォルダーに作成しました。
-jniフォルダー内でndk-buildを実行し、出来上がり、Android 7.0でも動作する/ libsフォルダーのすべてのバイナリー(バイナリーを選択し、assetsフォルダーに置き、適切なabiの正しいバイナリーをロードする戦略を実装するか、またはarmeabi バイナリを取得してアプリにロードするだけです)

ヒント: iperf3 はフォルダーを使用して、Android ではアクセスできない結果をキャッシュします。このフォルダーを変更する必要があります

Android.mk: (このスクリプトに .h ファイルを配置する必要はないと思います)
http://pastebin.com/fPsn0wsD

Application.mk:
http://pastebin.com/sgSsGNqB

ndk-build を使用してライブラリをビルドし、x86 などのさまざまなアーキテクチャの iperf3 をより簡単にビルドすることをお勧めします。

于 2017-01-11T13:51:26.893 に答える