上節(jié)我們講到了如何自定義交叉編譯鏈伤为,已經(jīng)生成了各個cpu架構(gòu)下的編譯鏈,如果不清楚的同學(xué)請看我的上一篇文章自定義NDK交叉編譯鏈据途,本篇將在上節(jié)的基礎(chǔ)上绞愚,利用已經(jīng)編譯出來的交叉編譯鏈來對第三方開源庫進行編譯成android上可以使用的動態(tài)庫或靜態(tài)庫
x86_64編譯
這里我們舉個例子叙甸,采用x86_64的編譯鏈來進行編譯,x86_64編譯鏈目錄如下:
廢話不多說爽醋,直接上腳本
#!/bin/sh
# Android cross-compile environment setup script
# Author : eggsy
# Date : 2018-08-28
# Version : 1.0
# Android NDK sources and standalone toolchain is put here
export DEV=${HOME}/Library/Android/sdk
export CHAIN_ENV=${HOME}/Chain/android-toolchain
# All the built binaries, libs and their header will be installed here
export PREFIX=${HOME}/Chain
# Don't mix up .pc files from your host and build target
export PKG_CONFIG_PATH=${PREFIX}/lib/pkgconfig
# GCC for Android version to use
# 4.9 is the only available version since NDK r11!
export GCC_VER=4.9
# The building system we are using (Linux x86_64)
export BUILD_SYS=x86_64-linux-gnu
# Set Android target API level
export ANDROID_API=21
# Set Android target arch
export ANDROID_ARCH=x86_64
# Set Android target name, according to Table 2 in
# https://developer.android.com/ndk/guides/standalone_toolchain.html
export ANDROID_TARGET=x86_64-none-linux-android
# The cross-compile toolchain we use
export TOOLCHAIN=x86_64-linux-android
# This is a symlink pointing to the real Android NDK r10e
export NDK=${CHAIN_ENV}/android-ndk-r10d
# The path of standalone NDK toolchain
# Refer to https://developer.android.com/ndk/guides/standalone_toolchain.html
export NDK_TOOLCHAIN=${CHAIN_ENV}/${ANDROID_ARCH}
# Set Android Sysroot according to API and arch
export SYSROOT=${NDK_TOOLCHAIN}/sysroot
# this one is the absolute, prebuilt path
# Binutils path
export CROSS_PREFIX=${NDK_TOOLCHAIN}/bin/${TOOLCHAIN}
# this one is the absolute, prebuilt path
# Non-exhaustive lists of compiler + binutils
export AR=${CROSS_PREFIX}-ar
export AS=${CROSS_PREFIX}-as
export LD=${CROSS_PREFIX}-ld
export NM=${CROSS_PREFIX}-nm
export CC=${CROSS_PREFIX}-gcc
export CXX=${CROSS_PREFIX}-g++
export CPP=${CROSS_PREFIX}-cpp
export CXXCPP=${CROSS_PREFIX}-cpp
export STRIP=${CROSS_PREFIX}-strip
export RANLIB=${CROSS_PREFIX}-ranlib
export STRINGS=${CROSS_PREFIX}-strings
# Set build flags
# Refer to https://developer.android.com/ndk/guides/standalone_toolchain.html
export PATH=$PATH:${PREFIX}/bin:${PREFIX}/lib
export CFLAGS="--sysroot=${SYSROOT} -I${SYSROOT}/usr/include -I${PREFIX}/include -fPIE -DANDROID -Wno-multichar"
export CXXFLAGS=${CFLAGS}
export CPPFLAGS="--sysroot=${SYSROOT} -I${SYSROOT}/usr/include -I${NDK_TOOLCHAIN}/include/c++/ -DANDROID -DNO_XMALLOC -mandroid"
export LIBS="-lc"
export LDFLAGS="-Wl,-rpath-link=-I${SYSROOT}/usr/lib -L${SYSROOT}/usr/lib -L${PREFIX}/lib -L${NDK_TOOLCHAIN}/lib"
這里有幾個環(huán)境變量需要我們注意下:
- CHAIN_ENV 定義了我們x86_64編譯鏈目錄所在的上級目錄
- ANDROID_ARCH 定義我們要編譯的平臺架構(gòu)類型蚁署,這里我們是x86_64,參見結(jié)構(gòu)類型
-
TOOLCHAIN 交叉編譯鏈名稱蚂四,參考上文截圖的目錄結(jié)構(gòu)中的
x86_64/x86_64-linux-android
中的最后一級目錄名稱 - ANDROID_TARGET 這里具體的值光戈,根據(jù)當(dāng)前編譯鏈的平臺x86_64選擇,具體參考target取值參數(shù)
- NDK_TOOLCHAIN 設(shè)置我們當(dāng)前具體的編譯鏈目錄
-
SYSROOT sysroot 是一個包含針對您的目標(biāo)的系統(tǒng)標(biāo)頭和庫的目錄遂赠,sysroot是跟原生支持的目標(biāo)Android API有關(guān)系的久妆,也就是我們在android studio中g(shù)radle配置的
targetSdkVersion
,這里有個問題就是如果我們選擇了API級別為21之后跷睦,編譯出來的庫在16或者23的設(shè)備上能正常運行嗎筷弦?答案是可以的,無需擔(dān)心抑诸,高版本的會向下兼容烂琴。
上面就是整個編譯腳本了,這里我們保存成android-toolchain-env.sh
文件蜕乡,接下來我們要開始對第三方的庫進行編譯奸绷,注意這里我們的平臺是x86_64,如果需要更換其他平臺层玲,自行更改上面的相關(guān)參數(shù)值即可号醉。
編譯libjpeg-turbo
這里我們選取編譯一個第三方開源庫libjpeg-turbo-1.5.3下載地址
下載完成后,解壓辛块,我們放到與android-toolchain-env.sh
同目錄下畔派,進行開始編譯
- 加載環(huán)境變量
source android-toolchain-env.sh
- 進入libjpeg-turbo-1.5.3目錄,進行配置
cd libjpeg-turbo-1.5.3
# 這里prefix定義了編譯后結(jié)果輸出的目錄
./configure --host=${TOOLCHAIN} --prefix=/Users/eggsy/Chain/android-output
make
make install
正常如果運行成功后润绵,我們在prefix指定的目錄中
這時候只需要拷貝include目錄下的頭文件线椰,并且在lib目錄中有靜態(tài)庫和動態(tài)庫可以使用,直接拷貝到android studio或者你的編譯系統(tǒng)中尘盼,就可以使用了士嚎,本篇交叉編譯第三方庫就講到這里,歡迎留言交流~下一篇我會講一下如何交叉編譯一個ffmpeg庫
參考文獻
http://zwyuan.github.io/2016/07/17/cross-compile-glib-for-android/
https://developer.android.com/ndk/guides/standalone_toolchain#sys