我创建了一个允许执行一些 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 是否互斥?
所以我尝试使用以下命令行编译我的 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"
我认为我的命令行有问题,但我不知道是什么。有没有人可以帮助我确定我在命令行中的错误?