如果没有基于NDK的编译经验,建议先阅读下我的前置文章
NDK移植编译&心得&ADB/GDB简单应用
由于Android在NDK18以后取消了对GCC的支持,而且为了系统内的程序方便,因此本次使用的NDK仍然是14b。
本次编译还参考了 编译可在Android上运行的依赖库:glib库 一文。
libffi 3.3
libiconv 1.16
gettext 0.20
pcre 8.44 -->这个是PCRE时代最后的版本
glib 2.54.2 -->为了与CentOS 7.5版本一致
一键下载
与上次的编译不同,这次我们需要多个模块的编译,因此需要一个公共的库目录,本次示例为/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
普通的模块只要如此操作,就可以使用(不局限于本次的glib编译)
个别模块需要调整configure参数,或在configure前进行其他的配置。
./configure --host=armv7-linux-androideabi --prefix=/opt/android-libs
make && make install
libffi 和 libiconv 采用通用编译方案即可。
需要调整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
直接禁用C++编译,否则需要调整的比较多
./configure --host=armv7-linux-androideabi --prefix=/opt/android-libs --disable-cpp
在上述模块全部完成后,即可进行glib2的编译
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
./configure --host=armv7-linux-androideabi --prefix=/opt/android-libs --cache-file=android.cache --enable-static --enable-libmount=no
至此,全部编译完成!