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变量是空的。

我检查了 Runtime.exec() 在 android 7 中工作正常,并且二进制文件正确复制到应用程序数据目录中。

每个人都知道我的过程中有什么问题吗?我编译 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="-静态"LDFLAGS="-pie -fuse-ld=bfd"

我认为我的命令行有问题,但我不知道是什么。有没有人可以帮助我确定我在命令行中的错误?

4

2 回答 2

4

我找到了你的问题,它帮助我为 Android 构建 iperf3,但我遇到了同样的问题。
您是否使用来自 Ubuntu 存储库的构建工具链?如果是,则构建的二进制文件将无法在 Android 7.0 上运行,因为它们使用的是旧版本的构建工具链。您将需要使用最新的 NDK 版本构建二进制文件。(现在是 r13b)

我是如何解决它的:
- 将 src 文件夹中的所有 iperf3 源文件放在 jni 文件夹
中 - 创建 Android.mk 和 Application.mk,我将在下面将它们与其他文件一起发布在同一文件夹中。
- 在 jni 文件夹中,我运行了 ndk-build 并且,瞧,/libs 文件夹上的所有二进制文件,甚至在 Android 7.0 上也可以工作(选择二进制文件,放入 assets 文件夹并实施你的策略来为正确的 abi 加载正确的二进制文件,或者只需获取 armeabi 二进制文件并加载到您的应用程序中)

提示:iperf3 使用一个文件夹来缓存 Android 无法访问的结果。您需要更改此文件夹才能工作:
https ://github.com/esnet/iperf/blob/670c18584bcf7a285f3561eb7ea38cc53600d0ab/src/iperf_api.c#L2621

Android.mk:(我认为没有必要将.h文件放在这个脚本上)
http://pastebin.com/fPsn0wsD

应用程序.mk:http:
//pastebin.com/sgSsGNqB

我建议使用 ndk-build 构建库,以便更轻松地为不同架构构建 iperf3,例如 x86。

于 2017-01-11T13:51:26.893 回答
0

如果你会得到错误:

iperf3: error - unable to create a new stream: Permission denied

或者:

iperf3: error - unable to create a new stream: No such file or directory

你可以做我在这里写的: https ://stackoverflow.com/a/58578227/12279527

于 2019-10-27T09:48:15.723 回答