25 linux ndk 头文件_基于Android NDK编译 C语言 通用Linux 应用程序

背景

笔者最近要使用基于Android 平台开发的芯片并做些测试,但芯片厂商并未提供一些常见的工具,所以需要下载对应工具代码编译后才能做测试。由于笔者之前不太了解Android,走了一些弯路,在此记录分享一下。

误区1:Android 用户态程序编译器与Linux 用户态程序编译器一样

由于笔者长期使用Linux,由于Android 底层也是使用Linux,故一直理解就算是用户态程序也跟Linux用户态的编译方式一样,故直接使用交叉编译链编译出了iperf。笔者发现这种方式编译出来的文件无法运行。经过一番研究,发现Android 用户态需要运行一些C/C++ 的程序,需要使用NDK编译链编译后才能运行。

误区2:最新NDK(v21)内无GCC不支持C编译

将最新的NDK下载下来后,发现编译链中并无相关gcc的编译器。最开始以为是最新版本已经不支持C的编译,然后尝试将开源工具在整个android工程中编译。这种方式可以编出来,但是构建的时候不是增量构建,比较耗时。后来通过查文档发现原来是新版本中Clang编译器代替了GCC。编译相关例子的可以参考官方文档,我下面用到的pciutils 和iperf的编译都是参考了官方文档。如下链接:

将 NDK 与其他构建系统配合使用 | Android NDK | Android Developers​developer.android.google.cn

编译 pciutils 的一些记录

笔者参考官方文档中的方式编写一个build脚本,发现有些库搜不到,修改Makefile中这些选项,将一些高级功能关掉后就能正常编译,且能正常运行,修改内容如下:

# Support for compressed pci.ids (yes/no, default: detect)
ZLIB=no
# Support for resolving ID's by DNS (yes/no, default: detect)
DNS=no
# Build libpci as a shared library (yes/no; or local for testing; requires GCC)
SHARED=no
# Use libkmod to resolve kernel modules on Linux (yes/no, default: detect)
LIBKMOD=no
# Use libudev to resolve device names using hwdb on Linux (yes/no, default: detect)
HWDB=no

编译脚本如下:

https://github.com/lijingyi2002/pciutils/blob/master/build.sh​github.com

归档文件如下:

lijingyi2002/pciutils​github.com
321764a9f834d7ed3fa62d42fba8bb98.png

编译 iperf 的一些记录

笔者同样参照官方文档中的方式编写一个build脚本,但iperf 的问题稍微较多,主要集中在如下几个问题:

1、链接报错,找不到mcount 函数,如下图

b42872d6654fd97750dc54f55f6610c4.png

原因是生成的Makefile中 部分代码有-pg 选项,但部分代码没有-pg选项,导致链接的时候报错,临时解决方法是修改生成后的 src/Makefile 将-pg选项删掉或者所有FLAG中都加上-pg 选项。笔者未找到哪里生成的这个选项,所以是临时解决办法。

2、运行过程中报错

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

原因是iperf 是基于Linux/Unix 来设计运行的,Android文件系统下 没有/tmp 目录,所以需要修改代码中 能存放ipert临时文件位置,参考修改如下。

3db18e848bdc86e489a82e62f8295a53.png

归档修改的iperf 源码 以及 归档的 Android5.0 iperf3.1 的编译版本

https://github.com/lijingyi2002/iperf/blob/3.1-STABLE/build.sh​github.com https://github.com/lijingyi2002/iperf/tree/3.1-STABLE/release/Android5.0​github.com

编译mmc-utils 的一些记录

当前已将编译过的版本归档到如下路径

https://github.com/lijingyi2002/mmc_utils​github.com

问题记录 1:初始化报错,会直接把Warning 当成ERR,修改Makefile 选项,-Werror 去掉后解决

mmc_cmds.c:1918:36: error: suggest braces around initialization of subobject [-Werror,-Wmissing-braces]
struct rpmb_frame frame_status = {0};

问题记录 2:初始化报错,部分函数未定义,增加头文件包含endian.h解决。

mmc_cmds.c:1931:14: error: implicit declaration of function 'be16toh' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
rpmb_type = be16toh(frame_in->req_resp);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值