使用自定義NDK交叉編譯鏈編譯第三方庫

上節(jié)我們講到了如何自定義交叉編譯鏈伤为,已經(jīng)生成了各個cpu架構(gòu)下的編譯鏈,如果不清楚的同學(xué)請看我的上一篇文章自定義NDK交叉編譯鏈据途,本篇將在上節(jié)的基礎(chǔ)上绞愚,利用已經(jīng)編譯出來的交叉編譯鏈來對第三方開源庫進行編譯成android上可以使用的動態(tài)庫或靜態(tài)庫

x86_64編譯

這里我們舉個例子叙甸,采用x86_64的編譯鏈來進行編譯,x86_64編譯鏈目錄如下:


x86_64編譯鏈內(nèi)容

廢話不多說爽醋,直接上腳本

#!/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同目錄下畔派,進行開始編譯

  1. 加載環(huán)境變量
source android-toolchain-env.sh
  1. 進入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指定的目錄中


編譯結(jié)果輸出

這時候只需要拷貝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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末悔叽,一起剝皮案震驚了整個濱河市莱衩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌娇澎,老刑警劉巖笨蚁,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡括细,警方通過查閱死者的電腦和手機伪很,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奋单,“玉大人锉试,你說我怎么就攤上這事±辣簦” “怎么了呆盖?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贷笛。 經(jīng)常有香客問我应又,道長,這世上最難降的妖魔是什么乏苦? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任株扛,我火速辦了婚禮,結(jié)果婚禮上汇荐,老公的妹妹穿的比我還像新娘洞就。我一直安慰自己,他們只是感情好掀淘,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布奖磁。 她就那樣靜靜地躺著,像睡著了一般繁疤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秕狰,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天稠腊,我揣著相機與錄音,去河邊找鬼鸣哀。 笑死架忌,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的我衬。 我是一名探鬼主播叹放,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼挠羔!你這毒婦竟也來了井仰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤破加,失蹤者是張志新(化名)和其女友劉穎俱恶,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡合是,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年了罪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片聪全。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡泊藕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出难礼,到底是詐尸還是另有隱情娃圆,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布鹤竭,位于F島的核電站踊餐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏臀稚。R本人自食惡果不足惜吝岭,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吧寺。 院中可真熱鬧窜管,春花似錦、人聲如沸稚机。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赖条。三九已至失乾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纬乍,已是汗流浹背碱茁。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留仿贬,地道東北人纽竣。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像茧泪,于是被迫代替她去往敵國和親蜓氨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,735評論 25 707
  • 背景:我們經(jīng)常在ndk開發(fā)中會使用到第三方庫队伟,例如ffmpeg穴吹、libjpeg等等第三方開源庫來完成我們的項目需求...
    蛋西閱讀 2,848評論 0 3
  • 前言 簡單地說,交叉編譯就是程序的編譯的環(huán)境和它的運行的環(huán)境不一樣嗜侮,即在一個平臺上生成另一個平臺上的可執(zhí)行代碼刀荒。需...
    seraphzxz閱讀 3,362評論 0 50
  • 前言 網(wǎng)上關(guān)于 Android 集成 FFmpeg 的文章很多代嗤,但大多數(shù)都只介紹了步驟,沒有說明背后的原理缠借,若之前...
    王英豪閱讀 5,889評論 18 71
  • 你好干毅,9月26日,今天下雨泼返,有雷硝逢,不夏不秋的雷。 今天做的有意義的事情大概是給YMG同學(xué)的華為機試送了一個助...
    寒江北閱讀 109評論 0 0