编译可在Android上运行的依赖库(一):glib库

简介: 这是系列文章,它们由《编译可在Android上运行的glib库》及其他4篇文章组成,这4篇文章在“编译依赖库”一节中列出。


编译可在Android上运行的依赖库(一):glib库



作者:寻禹@阿里聚安全



前言

这是系列文章,它们由《编译可在Android上运行的glib库》及其他4篇文章组成,这4篇文章在“编译依赖库”一节中列出。由于glib库依赖于其他第三方库,所以需要先将依赖的第三方库交叉编译到Android平台上才能成功的编译glib库,系列文章中除《编译可在Android上运行的glib库》外的其他交叉编译文章均是介绍如何对glib依赖库进行交叉编译。以上,所以叫系列文章,因为这些文章完整的介绍了如何编译可在Android上运行的glib库。

文章价值

这些文章的核心价值是Android平台的交叉编译经验和提供了新的编译方式。有些人把linux库移植到Android上的时候将makefile翻译为Android.mk文件(据我所知有不少人都是这样做的),而使用本文中的方法可以直接利用原有的makefile文件进行交叉编译。

编译环境

本文在Ubuntu 64位系统上对glib项目进行交叉编译。

约定

下文中的"NDK"若无特殊说明均指"Android NDK"。


步骤

1. 下载并安装Android NDK

下载并安装Android NDK的过程在这里不做介绍。

下载gitlib

git clone https://github.com/GNOME/glib.git 

2. 安装必要工具

    GNU autoconf 2.62

    GNU automake 1.11

    GNU libtool 2.2

    GNU gettext 0.10.40

    pkg-config 0.16

    gtk-doc

    libffi 3.0.0

关于编译glib项目要安装的工具可以参考glib源码根目录下的HACKING文件。

3. 设置NDK和SYSROOT环境变量

设置NDK环境变量

export NDK=<NDK目录> export PATH=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$PATH 

在"$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin"目录中包含了arm-linux-androideabi-gcc、arm-linux-androideabi-g++等交叉编译工具,不过交叉编译工具的路径根据NDK版本和编译工具版本的不同会有所变化。

设置SYSROOT环境变量

export SYSROOT="$NDK/platforms/android-21/arch-arm" 

SYSROOT表示一个目录,该目录中包含了目标的系统头文件和库,在当前上下文语境中目标表示的是arm cpu架构。路径中的"android-21"表示Android API级别,其中21表示的是Android5.0.1。

参考资料

本文使用Android NDK的工具进行交叉编译,google官方参考资料:Standalone Toolchain,这篇文章详细介绍了如何使用Android NDK工具进行交叉编译。

4. 编译依赖库

libiconv

版本:1.14

编译参考资料:编译可在Android上运行的libiconv

gettext

版本:0.19.7

编译参考资料:编译可在Android上运行的gettext

pcre

版本:8.38

编译参考资料:编译可在Android上运行的pcre

libffi

版本:3.2.1

编译参考资料:编译可在Android上运行的libffi

5. 编写android.cache

在glib源码的根目录下创建android.cache文件,然后在该文件中写入下面的内容:

glib_cv_long_long_format=ll glib_cv_stack_grows=no glib_cv_uscore=no ac_cv_func_posix_getpwuid_r=no ac_cv_func_posix_getgrgid_r=no 

cache文件的glib官方参考资料:Cross-compiling the GLib package

6. 运行autogen.sh

在glib源码根目录下输入命令:

./autogen.sh 

该脚本执行成功时,会生成一个名为"configure"的脚本文件。

7. 运行configure

CPP="arm-linux-androideabi-gcc -E" CPPFLAGS="-I${SYSROOT}/usr/include" CFLAGS="-fPIC -pic" CXXFLAGS="-fPIC -pic" LDFLAGS="-fPIC -pic" ./configure --prefix="${SYSROOT}/usr" --host=arm-linux-androideabi --cache-file=android.cache CFLAGS="--sysroot $SYSROOT" --enable-static 

如果不添加CPP和CPPFLAGS则将会报这个错误:"configure: error: C preprocessor "/lib/cpp" fails sanity check"。

--host选项的值"arm-linux-androideabi"在configure脚本中会被扩展成"arm-linux-androideabi-gcc"这样的编译工具名。

8. 编译和安装

使用make命令编译源码,当编译成功是使用"make install"命令进行安装,libiconv将会被安装到${SYSROOT}/usr/lib目录下,在上文中"--prefix="${SYSROOT}/usr"命令选项就是用来指定安装的目录的。


排错

configure.ac:88: error: possibly undefined macro: AC_DEFINE

问题

configure.ac:88: error: possibly undefined macro: AC_DEFINE 

这是一个很模糊的问题我编译glib时安装了automake、libtool工具,却还是提示这个错误。

解决办法

我安装了这些工具解决了这个办法:autoconf,automake,autopoint,pkg-config。

但是具体是安装了什么库解决了这个问题,我还不清楚。


解决办法来源帖子:

1、M Cross Bug 2 glib Build Fail #799:https://github.com/mxe/mxe/issues/799

2http://mxe.cc/#requirements-debian



作者:寻禹@阿里聚安全,更多技术文章,请点击阿里聚安全博客



阿里聚安全由阿里巴巴移动安全部出品,面向企业和开发者提供企业安全解决方案,全面覆盖移动安全、数据风控、内容安全、实人认证等维度,并在业界率先提出“以业务为中心的安全”,赋能生态,与行业共享阿里巴巴集团多年沉淀的专业安全能力。



相关文章
|
2月前
|
算法 数据处理 Android开发
掌握安卓性能优化的秘诀:电池寿命与运行效率的提升
【10月更文挑战第6天】 本文深入探讨了安卓应用开发中的性能优化技巧,重点分析了影响电池寿命和运行效率的关键因素,并提供了针对性的优化策略。通过代码优化、资源管理、后台任务处理等方法,开发者可以显著提升应用的续航能力和流畅度。同时,结合具体案例,展示了如何在实际开发中应用这些技巧,确保应用在各种场景下都能保持高效运行。本文旨在为安卓开发者提供实用的性能优化指导,助力其打造更优质的应用体验。
52 2
|
2月前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
26 1
|
2月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
97 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
2月前
|
编译器 Android开发
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
|
2月前
|
Ubuntu Shell API
Ubuntu 64系统编译android arm64-v8a 的openssl静态库libssl.a和libcrypto.a
Ubuntu 64系统编译android arm64-v8a 的openssl静态库libssl.a和libcrypto.a
|
2月前
|
Java Unix Linux
Android Studio中Terminal运行./gradlew clean build提示错误信息
遇到 `./gradlew clean build`命令执行出错时,首先应检查错误信息的具体内容,这通常会指向问题的根源。从权限、环境配置、依赖下载、版本兼容性到项目配置本身,逐一排查并应用相应的解决措施。记住,保持耐心,逐步解决问题,往往复杂问题都是由简单原因引起的。
284 2
|
Android开发
【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入代码示例 )(二)
【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入代码示例 )(二)
214 0
【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入代码示例 )(二)
|
Java Android开发
【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入代码示例 )(一)
【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入代码示例 )(一)
169 0
【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入代码示例 )(一)
|
Android开发
【IOC 控制反转】Android 视图依赖注入 ( 视图依赖注入步骤 | 视图依赖注入代码示例 )(二)
【IOC 控制反转】Android 视图依赖注入 ( 视图依赖注入步骤 | 视图依赖注入代码示例 )(二)
122 0
【IOC 控制反转】Android 视图依赖注入 ( 视图依赖注入步骤 | 视图依赖注入代码示例 )(二)
|
Java Android开发
【IOC 控制反转】Android 视图依赖注入 ( 视图依赖注入步骤 | 视图依赖注入代码示例 )(一)
【IOC 控制反转】Android 视图依赖注入 ( 视图依赖注入步骤 | 视图依赖注入代码示例 )(一)
118 0
【IOC 控制反转】Android 视图依赖注入 ( 视图依赖注入步骤 | 视图依赖注入代码示例 )(一)

推荐镜像

更多