IPerf3 for Android 7
程序员文章站
2024-02-26 23:20:16
...
在IPerf的官网上有IPerf3对应的Android 版本可以下载(https://iperf.fr/iperf-download.php),是在Google的源代码库中,但Google被天朝伟大的Great Firewall of China给屏蔽了,不如自己动手编译一个试试。
以下是翻译:———————————————————————
https://*.com/questions/40975003/iperf3-execution-from-android-7-doesnt-work
如果你正在使用ubuntu软件库中的构建工具链,那么构建出的二进制可执行文件在Android 7.0上将无效,因为那是那是一个老版本的构建链,你需要使用新版本的NDK(现在是版本是r13B)来构建二进制文件。
我是如何解决这个问题的:
- 将iperf3源码放入jni文件夹
- 创建Android.mk和Application.mk(我将在下面贴出来),并和其他文件放入同一个文件夹
- 进入jni文件夹,运行命令“ndk-build”,可以看到,所有的二进制文件都生成在/libs文件下,它们在Android 7.0上是有效。(选择二进制文件,放入assets文件夹下,导入对应ABI的二进制文件实现你的策略,或者直接获取armabi的二进制文件,然后导入你的app )
注意 :iperf3使用了一个Android不能访问的文件夹来缓存结果。你需要改变这个文件使iperf3正常工作。请参考https://github.com/esnet/iperf/blob/670c18584bcf7a285f3561eb7ea38cc53600d0ab/src/iperf_api.c#L2621
Android.mk
我认为在这个脚本中引入.h文件是没有必要的。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_CFLAGS += -fPIE
LOCAL_LDFLAGS += -fPIE -pie
LOCAL_MODULE := iperf3
LOCAL_SRC_FILES := cjson.c \
cjson.h \
flowlabel.h \
iperf.h \
iperf_api.c \
iperf_api.h \
iperf_error.c \
iperf_client_api.c \
iperf_locale.c \
iperf_locale.h \
iperf_server_api.c \
iperf_tcp.c \
iperf_tcp.h \
iperf_udp.c \
iperf_udp.h \
iperf_sctp.c \
iperf_sctp.h \
iperf_util.c \
iperf_util.h \
main.c \
net.c \
net.h \
portable_endian.h \
queue.h \
tcp_info.c \
tcp_window_size.c \
tcp_window_size.h \
timer.c \
timer.h \
units.c \
units.h \
version.h
include $(BUILD_EXECUTABLE)
Application.mk
APP_ABI := all
APP_PLATAFORM := android-16
我认为使用ndk-build为不同架构平台构建iperf3更加容易,例如x86架构
翻译结束————————————————————————-
说明几点:
- Android.mk中确实没必要引入头文件,因为ndk-build会自动去搜索
- Application.mk中的APP_ABI := all 是表示要编译生成当前NDK版本所支持的所有平台(ABI信息库文件),可参考 (https://blog.csdn.net/qq_31387043/article/details/50899589)