Я создаю приложение для Android, которое позволяет выполнять некоторые команды iperf. Для этого я получил версию 3 исходного кода проекта IPerf C и кросс-компилировал его с помощью следующих команд:
> 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
После кросс-компиляции у меня получился бинарный файл, который я поместил в папку assets в своем андроид-проекте.
Для использования IPerf из Android я создаю копию двоичного файла следующим образом:
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. Когда я запускаю свое приложение на Nexus 5X в Android 7, кажется, что команда 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"
Я думаю, что с моей командной строкой что-то не так, но я не знаю, что. Кто-нибудь может помочь мне определить, что я ошибаюсь в своей командной строке?
$ adb push iperf3 /data/local/tmp; adb shell "chmod +x /data/local/tmp/iperf3"; adb shell "/data/local/tmp/iperf3 -c <server> <argument>"
. - person Sergio   schedule 05.12.2016CANNOT LINK EXECUTABLE "/data/local/tmp/iperf3": /data/local/tmp/iperf3 : has text relocations
. И если я сделаю это на устройстве, отличном от Nexus 5X, я получуiperf3: error - unable to create a new stream : Permission denied
- person Red   schedule 05.12.2016-fpie
кCFLAGS
, поскольку опция компоновщика-pie
поможет, только если связанный код не зависит от позиции. Также дважды проверьте, что эти флаги передаются компилятору и компоновщику. - person Sergio   schedule 05.12.2016./configure --host=arm-linux --prefix=/home/laboPC/Downloads CC=arm-linux-androideabi-gcc CXX=arm-linux-androideabi-g++ CFLAGS="-static -fpie" CXXFLAGS="-static" LDFLAGS="-pie -fuse-ld=bfd"
и получаюwarrning linker : /data/local/tmp/iperf3 : unsupported flag DT_FLAGS_1=0x8000000. /data/local/tmp/iperf3 : has text relocations
- person Red   schedule 05.12.2016