目录
这部分主要是为了得到libudev(因为原来的libudev已经不更新了),eudev的下载地址如下:
https://github.com/gentoo/eudev
相应的代码最好是在Ubuntu中先编译通过(即获取到x86版本的),以版本3.2.14为例。
1. Ubuntu中编译
如果需要在NDK中编译通过,最好现在Linux中编译通过。
- 安装必要的工具,
sudo apt-get install autoconf automake libtool
- 安装libusb1.0
sudo apt install libusb-1.0-0-dev
- 执行autogen
autogen.sh将会检测当前系统是否满足源代码包依赖项和工具库,执行相应的检查和更新操作,并根据configure.ac文件中的配置,生成Makefile文件,以便后续编译、安装和部署。
./autogen.sh
- 执行configure
configure是一个脚本,一般由Autoconf工具生成,它会检验当前的系统环境,看是否满足安装软件所必需的条件:比如当前系统是否支持待安装软件,是否已经安装软件依赖等。configure脚本最后会生成一个Makefile文件。
这一步如果有错误必须要解决,不然后面编译会出错。
- 执行make
一般linux发行版本内是没问题的。
2. NDK环境配置
首先需要下载NDK,NDK在r17c版本前是支持gcc,后面的都是clang,而第三方库很多都是Linux上的,使用gcc编译,所以原则上是优先下载r17c的版本。
复制autogen.sh,重命名为envsetup.sh
#!/bin/sh
export ROOT=~/Project
export NDK=$ROOT/android-ndk-r17c
export TARGET=arm-linux-androideabi
export ARCH=arm
export HOST=$TARGET
export SYSROOT=$NDK/sysroot
export TOOLCHAIN=$NDK/toolchains/$TARGET-4.9/prebuilt/linux-x86_64
export API=26
export CC=$TOOLCHAIN/bin/$TARGET-gcc
export CXX=$TOOLCHAIN/bin/$TARGET-g++
#export CPP="$TOOLCHAIN/bin/$TARGET-gcc -E"
export AR=$TOOLCHAIN/bin/$TARGET-ar
export AS=$CC
export LD=$TOOLCHAIN/bin/$TARGET-ld
export RANLIB=$TOOLCHAIN/bin/$TARGET-ranlib
export STRIP=$TOOLCHAIN/bin/$TARGET-strip
export CFLAGS="--sysroot=$NDK/platforms/android-$API/arch-$ARCH \
-D__ANDROID_API__=$API \
-I$SYSROOT/usr/include \
-I$SYSROOT/usr/include/$TARGET \
-fPIC -Wno-attributes"
export CXXFLAGS=$CFLAGS
#export CPPFLAGS=$CFLAGS
export LDFLAGS="-pthread -lc -L\"$SYSROOT/usr/lib\""
export PATH=$PATH:$TOOLCHAIN/bin/
- TARGET : 主机的类型,可以参考下面的链接
将 NDK 与其他构建系统配合使用 | Android NDK | Android Developers
可以进NDK目录android-ndk-r17c/toolchains内查看当前NDK支持的类型,例如:
这里有6个TARGET类型(即带版本4.9的那6个文件夹) ,根据硬件平台选择,Zero3的是arm-linux-androideabi
- ARCH:目标CPU构架,例如在NDK目录中android-ndk-r17c/platforms/android-24可以查到支持的类型
- HOST:用于指定交叉编译的宿主平台,这里与目标平台一致。
- SYSROOT:设置系统根目录
- TOOLCHAIN:指定工具链的路径,这里使用的是GCC 4.9版本,适用于Linux x86_64平台。
- API:指定Android最小的API等级
- CC:设置C编译器。
- CXX:设置C++编译器。
- AR:设置创建静态库的ar工具。
- AS:设置汇编器
- LD:设置链接器
- RNDLIB:设置用于生成库索引的ranlib工具。
- STRIP:设置用于剥离符号的strip工具。
- CFLAGS:设置C编译器的标志
CXXFLAGS:设置C++编译器的标志
LDFLAGS:设置链接器的标志
3. 编译
以此执行:
./envsetup.sh
./autogen.sh --host $HSOT
./configure --host $HOST --target $TARGET --prefix $SYSROOT/usr/local
make
出现编译错误。
- error: 'LINE_MAX' undeclared (first use in this function)
缺少LINE_MAX的定义,在src/shared/missing.h添加
#ifndef LINE_MAX
#define LINE_MAX 2048
#endif
- error: 'program_invocation_short_name' undeclared (first use in this function)
在src/shared/missing.h添加
#ifndef program_invocation_short_name
#define program_invocation_short_name "depmod"
#endif
- fatal error: selinux/selinux.h: No such file or directory
把selinux关掉
./configure --host $HOST --target $TARGET --disable-selinux --prefix $SYSROOT/usr/local
- error: 'RLIMIT_NLIMITS' undeclared here (not in a function)
在src/shared/missing.h添加
#ifndef RLIMIT_NLIMITS
#define RLIMIT_NLIMITS 16
#endif
- error: 'IPTOS_LOWCOST' undeclared here (not in a function)
在src/shared/missing.h添加
#ifndef IPTOS_LOWCOST
#define IPTOS_LOWCOST 0x02
#endif
- fatal error: blkid/blkid.h: No such file or directory
把blkid关掉
./configure --host $HOST --target $TARGET --disable-selinux --disable-blkid --prefix $SYSROOT/usr/local
- error: undefined reference to 'get_current_dir_name'
在src/shared/missing.h添加
- error: 'SG_FLAG_LUN_INHIBIT' undeclared (first use in this function)
在src/shared/missing.h添加
#ifndef SG_FLAG_LUN_INHIBIT
#define SG_FLAG_LUN_INHIBIT 2 /* default is to put device's lun into */
#endif
- error: undefined reference to 'is_fido_security_token_desc'
运行make clean清一下
- warning: implicit declaration of function '__bswap_16' [-Wimplicit-function-declaration]
将Ubuntu中的usr/include/byteswap.h拷贝到NDK的sysroot/usr/include中,将Ubuntu中的usr/include/bits/byteswap.h、types.h、wordsize.h、timesize.h、typesizes.h、time64.h拷贝到NDK的sysroot/usr/include/bits/中
然后在android-ndk-r17c/sysroot/usr/include/bits/byteswap.h中添加
# define __GNUC_PREREQ(maj, min) 1
4. 安装
在源代码external文件夹内新家一个文件夹libudev,将libudev.so拷贝到这个文件夹内,再新建Android.bp文件。
cc_prebuilt_library_shared {
name: "libudev",
//proprietary: true,
//product_specific: true,
target: {
android_arm: {
srcs: ["libudev.so"],
},
},
strip: {
none:true,
},
}
在device/softwinner/apollo/apollo_p2.mk文件中添加
PRODUCT_PACKAGES += libudev.so
PRODUCT_PACKAGES += libusb.so