【原創】IMSDroid學習之一:編譯doubango for android

編譯步驟

按照https://code.google.com/p/imsdroid/wiki/Building_DoubangoThe easy way步驟進行編譯:

  1. 準備編譯環境:CentOS 7.1虛擬機中安裝libtool、android-ndk等工具(ps:這裏我使用的是當前最新的r10e版本的ndk,而沒有使用上述wiki中使用的r9c版本,這個導致了後面問題的出現);
  2. 在doubango源碼目錄下依次執行./autogen.sh./android_build.sh gpl

編譯出現的問題

./android_build.sh gpl命令執行到最後提示:

cp: cannot stat ‘/home/xiehui/Work/Project/DOUBANGO/WorkSpace/doubango/android-projects/output/gpl/armv5te/lib/libtinyWRAP.so.0.0.0’: No such file or directory
cp: cannot stat ‘/home/xiehui/Work/Project/DOUBANGO/WorkSpace/doubango/android-projects/output/gpl/armv5te/lib/libplugin_audio_opensles.so.0.0.0’: No such file or directory
cp: cannot stat ‘/home/xiehui/Work/Project/DOUBANGO/WorkSpace/doubango/android-projects/output/gpl/armv7-a/lib/libtinyWRAP.so.0.0.0’: No such file or directory
cp: cannot stat ‘/home/xiehui/Work/Project/DOUBANGO/WorkSpace/doubango/android-projects/output/gpl/armv7-a/lib/libplugin_audio_opensles.so.0.0.0’: No such file or directory
cp: cannot stat ‘/home/xiehui/Work/Project/DOUBANGO/WorkSpace/doubango/android-projects/output/gpl/armv7-a-neon/lib/libtinyWRAP.so.0.0.0’: No such file or directory

最後只成功生成了x86的庫,其他CPU架構的庫沒有成功生成。

問題分析

1.嘗試按照The hard way進行編譯
執行./configure --host=arm-linux-androideabi --with-android-cpu=armv5te --prefix=/tmp/doubango/output/android/armv5te,報如下錯誤:

checking for arm-linux-androideabi-gcc... /home/xiehui/Work/Project/DOUBANGO/WorkSpace/doubango/my-android-toolchain-armv5te/bin/arm-linux-androideabi-gcc
checking whether the C compiler works... no
configure: error: in `/home/xiehui/Work/Project/DOUBANGO/WorkSpace/doubango':
configure: error: C compiler cannot create executables

查看doubango目錄,沒有my-android-toolchain-armv5te目錄,當然找不到編譯工具了。初步懷疑armv5te等處理器架構的庫沒有生成的原因,就是未生成相應的my-android-toolchain-xxx目錄。

2.爲什麼沒有my-android-toolchain-armv5te
configure文件中搜索“my-android-toolchain”,找到如下代碼:

### ANDROID-TOOLCHAIN (http://www.kandroid.org/ndk/docs/STANDALONE-TOOLCHAIN.html)
if test "$target_os" = "android"; then
    case "$android_cpu" in
        x86)
            export SYSROOT=$NDK/platforms/android-9/arch-x86
                export ANDROID_PREFIX=i686-linux-android
            export ANDROID_TOOLCHAIN=$(pwd)/my-android-toolchain-android-x86
                $NDK/build/tools/make-standalone-toolchain.sh --platform=android-9 --arch=x86 --install-dir=$ANDROID_TOOLCHAIN
            TARGET_ARCH="x86"

        ;;
        armv7-a)
            export ANDROID_PREFIX=arm-linux-androideabi
            export SYSROOT=$NDK/platforms/android-3/arch-arm
            export ANDROID_TOOLCHAIN=$(pwd)/my-android-toolchain-android-armv7-a
                $NDK/build/tools/make-standalone-toolchain.sh --platform=android-3 --install-dir=$ANDROID_TOOLCHAIN
                export CFLAGS='-march=armv7-a -mfloat-abi=softfp'
                export LDFLAGS='-Wl,--fix-cortex-a8'
            TARGET_ARCH="arm"

        ;;
        armv7-a-neon)
            export ANDROID_PREFIX=arm-linux-androideabi
            export SYSROOT=$NDK/platforms/android-3/arch-arm
                export ANDROID_TOOLCHAIN=$(pwd)/my-android-toolchain-android-armv7-a-neon
                $NDK/build/tools/make-standalone-toolchain.sh --platform=android-3 --install-dir=$ANDROID_TOOLCHAIN
                export CFLAGS='-march=armv7-a -mfloat-abi=softfp -mfpu=neon'
                export LDFLAGS='-Wl,--fix-cortex-a8'
            TARGET_ARCH="arm"

        ;;
        *)
            export ANDROID_PREFIX=arm-linux-androideabi
            export SYSROOT=$NDK/platforms/android-3/arch-arm
            export ANDROID_TOOLCHAIN=$(pwd)/my-android-toolchain-armv5te
                $NDK/build/tools/make-standalone-toolchain.sh --platform=android-3 --install-dir=$ANDROID_TOOLCHAIN
            TARGET_ARCH="arm"

        ;;
    esac

其中$NDK/build/tools/make-standalone-toolchain.sh --platform=android-3 --install-dir=$ANDROID_TOOLCHAIN就是用來生成非x86平臺的編譯工具的。看到這裏,基本能確認問題原因就是這條指令沒有執行成功。單獨運行這條指令,提示Unable to auto-config arch from toolchain,即不能自動配置(處理器)架構。通過手動添加–arch=arm後,成功生成了相應的編譯工具及目錄。

問題解決方法

執行完./autogen.sh並生成了configure文件後,對configure中的$NDK/build/tools/make-standalone-toolchain.sh --platform=android-3 --install-dir=$ANDROID_TOOLCHAIN進行修改,添加--arch=arm,再執行./android_build.sh gpl

總結

  1. 成功編譯後,懷疑r9c版本的ndk可以auto-config arch,對r9c版本的ndk進行測試後發現的確如此,從而肯定了上述問題原因就是r10e版本的ndk不能auto-config arch了(頓時覺得自己有點瓜,不按別人要求的做,非要用最新的工具);
  2. 其實在最開始執行./android_build.sh gpl時,Unable to auto-config arch from toolchain的錯誤提示也應該是有的,只是因爲提示信息太多,翻頁滾動太快,自己沒有看見。
  3. 現在還有一點不太明白的是:爲什麼./android_build.sh gpl中執行./configure --host=$HOST --with-android-cpu=$arch --prefix=$HOME/$arch --with-pic --enable-nonfree=$ENABLE_NONFREE --enable-gpl=$ENABLE_GPL --enable-debug=$DEBUG $OPTIONS
    時,當arch爲armv5te等非x86架構時不報錯終止,而手動執行./configure --host=arm-linux-androideabi --with-android-cpu=armv5te --prefix=/tmp/doubango/output/android/armv5te就會報錯終止。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章