当前位置: 首页 > 工具软件 > IMSDroid > 使用案例 >

【原创】IMSDroid学习之一:编译doubango for android

锺威
2023-12-01

编译步骤

按照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就会报错终止。
 类似资料: