前兩天在論壇上看到一個問題,大意是怎麼在UBUNTU下使用NDK r20編譯FFmpeg。我第一反應是不該用r20,因為我在很早前用過沒有gcc版本的NDK,發現有很多問題不能編譯,就立馬回覆了個使用r12b來編譯。回到家我細想了一下,如果我就是想要用r20的NDK編譯最新的FFmpeg呢?不如我們 ...
前兩天在論壇上看到一個問題,大意是怎麼在UBUNTU下使用NDK-r20編譯FFmpeg。我第一反應是不該用r20,因為我在很早前用過沒有gcc版本的NDK,發現有很多問題不能編譯,就立馬回覆了個使用r12b來編譯。回到家我細想了一下,如果我就是想要用r20的NDK編譯最新的FFmpeg呢?不如我們花點時間來折騰下。
NDK不知道從什麼版本徹底改革,使用了clang來編譯,這還不是最關鍵的,在新的NDK里sysroot也改變了(關鍵是google在NDK根目錄里建了一個sysroot--錯誤的sysroot),這就導致FFmpeg過不了cc檢測。常見的報錯都是沒有crtbegin_so.o或者找不到系統庫連接。
所以sysroot其實是罪魁禍首,如果我們使用正確的sysroot一切就好辦了。我用了個取巧的方式來查看sysroot,在AS里建一個c++項目,故意寫錯一段代碼就能看到grade的log裡面明確標出了使用的sysroot($NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot)這才是我們需要的。
學會看log
很多同學遇到編譯問題就只截圖終端,其實真正的log在ffbuild/conf.log,這裡面詳細說明瞭錯在什麼地方。
正確的配置
export NDK=/home/fgodt/Android/Sdk/ndk-bundle
export API=22
export ARCH=aarch64
export PLATFORM=aarch64
export TARGET=$PLATFORM-linux-android
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin
#正確的sysroot
export SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
export CPU=aarch64
export PREFIX=/home/fgodt/FFmpeg/android/$CPU
export CFLAG="-D__ANDROID_API__=$API -Os -fPIC -DANDROID "\
######################################################
#aarch64 不需要 --cpu , 如果是其他cpu請添加下麵這句
#--cpu=$PLATFORM \
######################################################
./configure \
--prefix=$PREFIX \
--cc=$TOOLCHAIN/$TARGET$API-clang \
--cxx=$TOOLCHAIN/$TARGET$API-clang++ \
--ld=$TOOLCHAIN/$TARGET$API-clang \
--target-os=android \
--arch=$ARCH \
--cross-prefix=$TOOLCHAIN/$ARCH-linux-android- \
--disable-asm \
--enable-cross-compile \
--disable-shared \
--disable-doc \
--enable-runtime-cpudetect \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-decoders \
--disable-encoders \
--disable-devices \
--sysroot=$SYSROOT \
--extra-cflags="$CFLAG" \
--extra-ldflags=""
註意
這裡的配置只是簡單的驗證了是否通過編譯,你應該根據自己的需要裁減FFmpeg,如果需要硬體加速等功能也需要添加JNI配置和開啟MediaCodec。
至於根目錄下的sysroot有什麼用我還沒有細研究,總不能憑白無故多一個sysroot吧。
最後希望對還沒編譯過的同學有用