OrangePi Zero 3学习笔记(Android篇)4 - eudev编译(获取libudev.so)

目录

[1. Ubuntu中编译](#1. Ubuntu中编译)

[2. NDK环境配置](#2. NDK环境配置)

[3. 编译](#3. 编译)

[4. 安装](#4. 安装)


这部分主要是为了得到libudev(因为原来的libudev已经不更新了),eudev的下载地址如下:

https://github.com/gentoo/eudev

相应的代码最好是在Ubuntu中先编译通过(即获取到x86版本的),以版本3.2.14为例。

1. Ubuntu中编译

如果需要在NDK中编译通过,最好现在Linux中编译通过。

  • 安装必要的工具,
bash 复制代码
sudo apt-get install autoconf automake libtool
  • 安装libusb1.0
bash 复制代码
sudo apt install libusb-1.0-0-dev
  • 执行autogen

autogen.sh将会检测当前系统是否满足源代码包依赖项和工具库,执行相应的检查和更新操作,并根据configure.ac文件中的配置,生成Makefile文件,以便后续编译、安装和部署。

bash 复制代码
./autogen.sh
  • 执行configure

configure是一个脚本,一般由Autoconf工具生成,它会检验当前的系统环境,看是否满足安装软件所必需的条件:比如当前系统是否支持待安装软件,是否已经安装软件依赖等。configure脚本最后会生成一个Makefile文件。

这一步如果有错误必须要解决,不然后面编译会出错。

  • 执行make

一般linux发行版本内是没问题的。

2. NDK环境配置

首先需要下载NDK,NDK在r17c版本前是支持gcc,后面的都是clang,而第三方库很多都是Linux上的,使用gcc编译,所以原则上是优先下载r17c的版本。

复制autogen.sh重命名为envsetup.sh

bash 复制代码
#!/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. 编译

以此执行:

bash 复制代码
./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添加

cpp 复制代码
#ifndef LINE_MAX
#define LINE_MAX 2048
#endif
  • error: 'program_invocation_short_name' undeclared (first use in this function)

在src/shared/missing.h添加

cpp 复制代码
#ifndef program_invocation_short_name
#define program_invocation_short_name "depmod"
#endif
  • fatal error: selinux/selinux.h: No such file or directory

把selinux关掉

bash 复制代码
./configure --host $HOST --target $TARGET --disable-selinux --prefix $SYSROOT/usr/local
  • error: 'RLIMIT_NLIMITS' undeclared here (not in a function)

在src/shared/missing.h添加

cpp 复制代码
#ifndef RLIMIT_NLIMITS
#define RLIMIT_NLIMITS 16
#endif
  • error: 'IPTOS_LOWCOST' undeclared here (not in a function)

在src/shared/missing.h添加

cpp 复制代码
#ifndef IPTOS_LOWCOST
#define	IPTOS_LOWCOST		0x02
#endif
  • fatal error: blkid/blkid.h: No such file or directory

把blkid关掉

bash 复制代码
./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添加

cpp 复制代码
#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中添加

cpp 复制代码
# define __GNUC_PREREQ(maj, min)        1

4. 安装

在源代码external文件夹内新家一个文件夹libudev,将libudev.so拷贝到这个文件夹内,再新建Android.bp文件。

cpp 复制代码
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文件中添加

bash 复制代码
PRODUCT_PACKAGES += libudev.so
PRODUCT_PACKAGES += libusb.so
相关推荐
丰锋ff40 分钟前
考研英一学习笔记 2018年
笔记·学习·考研
12960045240 分钟前
pytorch基础的学习
人工智能·pytorch·学习
岂是尔等觊觎40 分钟前
软件设计师教程——第一章 计算机系统知识(下)
经验分享·笔记·其他
Oll Correct1 小时前
计算机二级WPS Office第三套电子表格
笔记
睡不着还睡不醒2 小时前
【笔记】unsqueeze
笔记
LouSean2 小时前
Unity按钮事件冒泡
经验分享·笔记·学习·unity·游戏引擎
AI新视界3 小时前
『Python学习笔记』ubuntu解决matplotlit中文乱码的问题!
linux·笔记·ubuntu
Chef_Chen3 小时前
R语言学习--Day01--数据清洗初了解andR的经典筛选语法
学习
njsgcs4 小时前
Mamba 状态空间模型 笔记 llm框架 一维卷积
笔记