NDK编译glib2

1 前言

如果没有基于NDK的编译经验,建议先阅读下我的前置文章
NDK移植编译&心得&ADB/GDB简单应用

由于Android在NDK18以后取消了对GCC的支持,而且为了系统内的程序方便,因此本次使用的NDK仍然是14b。

本次编译还参考了 编译可在Android上运行的依赖库:glib库 一文。

2 版本配套表

libffi 3.3
libiconv 1.16
gettext 0.20
pcre 8.44 -->这个是PCRE时代最后的版本
glib 2.54.2 -->为了与CentOS 7.5版本一致

一键下载

3 前置准备

与上次的编译不同,这次我们需要多个模块的编译,因此需要一个公共的库目录,本次示例为/opt/android-libs。与之前不同的是需要在CFLAGS和LDFLAGS额外包含这个目录,并配置pkgconfig。

#!/bin/bash
export ANDROID_NDK_PATH=/opt/android-ndk-r14b
export TOOLCHAINS_PATH=${ANDROID_NDK_PATH}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin
export PATH=${PATH}:${TOOLCHAINS_PATH}
export SYSROOT_PATH=${ANDROID_NDK_PATH}/platforms/android-21/arch-arm
export LIBSTD_PATH=${ANDROID_NDK_PATH}/sources/cxx-stl/gnu-libstdc++/4.9

export CC=arm-linux-androideabi-gcc
export CXX=arm-linux-androideabi-g++
export AR=arm-linux-androideabi-ar
export CFLAGS="-DANDROID -fPIC  -std=c++11 -ffunction-sections -funwind-tables -fstack-protector  -no-canonical-prefixes -fexceptions -frtti -marm -march=armv7-a -mtune=cortex-a8 -mfloat-abi=softfp -mfpu=neon -mthumb -fno-strict-aliasing -finline-limit=64 -Wa,--noexecstack -Wformat -Werror=format-security -g -Wall --sysroot=${SYSROOT_PATH} -I${LIBSTD_PATH}/include -I${LIBSTD_PATH}/libs/armeabi/include -I${ANDROID_NDK_PATH}/sources/android/cpufeatures/  -I/opt/android-libs/include"
export LDFLAGS="--sysroot=${SYSROOT_PATH} -L/opt/android-libs/lib -L${LIBSTD_PATH}/libs/armeabi -lgnustl_shared -lgcc -no-canonical-prefixes -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -lstdc++ -lsupc++ -lc -lm -pthread"
export PKG_CONFIG_PATH=/opt/android-libs/lib/pkgconfig

4 通用编译方案

普通的模块只要如此操作,就可以使用(不局限于本次的glib编译)
个别模块需要调整configure参数,或在configure前进行其他的配置。

./configure --host=armv7-linux-androideabi --prefix=/opt/android-libs
make && make install

5 各模块调整

libffi 和 libiconv 采用通用编译方案即可。

5.1 gettext模块编译

需要调整LDFLAGS,再进行configure/make操作,否则make install时会失败。
编译完该模块后重新导出LDFLAGS为通用状态。
如果忘了设置,需要重新configure && make clean && make distclean

export LDFLAGS="--sysroot=${SYSROOT_PATH} -L/opt/android-libs/lib -L/opt/code/webrtc_android/gettext-0.20/gettext-tools/gnulib-lib/.libs/ -L${LIBSTD_PATH}/libs/armeabi -lgnustl_shared -lgcc -no-canonical-prefixes -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -lstdc++ -lsupc++ -lc -lm -pthread"

代码修改:

# cr-statement.c 多处fprintf报错,修改成如下即可
fprintf (a_fp, "%s",str) ;

# msginit.c  pw_gecos不存在,设置一个默认值即可
#ifndef __ANDROID__
	fullname = pwd->pw_gecos;
#else
	fullname = "android";
#endif

5.2 pcre模块编译

直接禁用C++编译,否则需要调整的比较多

./configure --host=armv7-linux-androideabi --prefix=/opt/android-libs --disable-cpp

5.3 glib2编译

在上述模块全部完成后,即可进行glib2的编译

  1. 在glib2的源码根目录下创建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
  1. 调整configure
./configure --host=armv7-linux-androideabi --prefix=/opt/android-libs --cache-file=android.cache --enable-static --enable-libmount=no

至此,全部编译完成!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值