Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为Android编译FFMpeg(Ubuntu14)-找不到符号_Android_Ubuntu_Android Ndk_Ffmpeg - Fatal编程技术网

为Android编译FFMpeg(Ubuntu14)-找不到符号

为Android编译FFMpeg(Ubuntu14)-找不到符号,android,ubuntu,android-ndk,ffmpeg,Android,Ubuntu,Android Ndk,Ffmpeg,我正在尝试为Android编译FFMpeg,但在Android 5上运行Android 4上的APK时遇到问题。我没有收到这个令人不满意的链接错误: 05-09 15:16:18.880 22160-22304/com.gpac.Osmo4 I/LibrariesLoader﹕ Loading library avcodec... 05-09 15:16:18.910 22160-22304/com.gpac.Osmo4 E/dalvikvm﹕ dlopen("/data/app-lib/c

我正在尝试为Android编译FFMpeg,但在Android 5上运行Android 4上的APK时遇到问题。我没有收到这个令人不满意的链接错误:

05-09 15:16:18.880  22160-22304/com.gpac.Osmo4 I/LibrariesLoader﹕ Loading library avcodec...
05-09 15:16:18.910  22160-22304/com.gpac.Osmo4 E/dalvikvm﹕ dlopen("/data/app-lib/com.gpac.Osmo4-1/libavcodec.so") failed: Cannot load library: soinfo_relocate(linker.cpp:975): cannot locate symbol "log2f" referenced by "libavcodec.so"...
05-09 15:16:18.920  22160-22304/com.gpac.Osmo4 E/LibrariesLoader﹕ Failed to load library : avcodec due to link error Cannot load library: soinfo_relocate(linker.cpp:975): cannot locate symbol "log2f" referenced by "libavcodec.so"...
    java.lang.UnsatisfiedLinkError: Cannot load library: soinfo_relocate(linker.cpp:975): cannot locate symbol "log2f" referenced by "libavcodec.so"...
我使用的是NDK10D,工具链4.9,但我也尝试了NDK10和NDK10,我得到了同样的结果。 使用旧NDK版本编译时,唯一的区别是收到一条警告消息:

incompatible declaration of built-in function log2f
我检查了libm.so log2f应该在哪里,它在目标设备上,当然这里没有定义log2f函数,但是手动替换库可能会使其他一些东西崩溃+我需要根手机

我知道这是一个链接器的问题,应该不难解决,但我已经没有主意了

编辑: 我正在尝试编译ffmpeg 2.4.3 我用于配置的脚本:

#!/bin/bash

if [ "$NDK" = "" ]; then
    echo NDK variable not set, assuming ${HOME}/android-ndk
    export NDK=${HOME}/android-ndk
fi

echo "Compiling with NDK located at: $NDK"

ROOT_DIR=`cd ..; pwd`
CUR_DIR=`pwd`

echo "Fetching Android system headers"
if [ ! -d "$ROOT_DIR/android-source/frameworks/base" ]; then
    git clone --depth=1 --branch cm-11.0 https://github.com/CyanogenMod/android_frameworks_base.git "$ROOT_DIR/android-source/frameworks/base"
fi
if [ ! -d "$ROOT_DIR/android-source/system/core" ]; then
    git clone --depth=1 --branch cm-11.0 https://github.com/CyanogenMod/android_system_core.git "$ROOT_DIR/android-source/system/core"
fi
if [ ! -d "$ROOT_DIR/android-source/frameworks/av" ]; then
    git clone --depth=1 --branch cm-11.0 https://github.com/CyanogenMod/android_frameworks_av "$ROOT_DIR/android-source/frameworks/av"
fi
if [ ! -d "$ROOT_DIR/android-source/hardware/libhardware" ]; then
    git clone --depth=1 --branch cm-11.0 https://github.com/CyanogenMod/android_hardware_libhardware.git "$ROOT_DIR/android-source/hardware/libhardware"
fi
if [ ! -d "$ROOT_DIR/android-source/frameworks/native" ]; then
    git clone --depth=1 --branch cm-11.0 https://github.com/CyanogenMod/android_frameworks_native.git "$ROOT_DIR/android-source/frameworks/native"
fi

echo "Fetching Android libraries for linking"
# Libraries from any froyo/gingerbread device/emulator should work
# fine, since the symbols used  should be available on most of them.
if [ ! -d "$ROOT_DIR/android-libs" ]; then
    wget http://download.cyanogenmod.org/get/jenkins/65493/cm-10.2.1.3-serranoltexx.zip -P../
    unzip ../cm-10.2.1.3-serranoltexx.zip system/lib/* -d../
    mv ../system/lib "$ROOT_DIR/android-libs"
    rmdir ../system
    rm ../cm-10.2.1.3-serranoltexx.zip
fi

ANDROID_SOURCE="$ROOT_DIR/android-source"
echo "ANDROID_SOURCE: $ANDROID_SOURCE"
ANDROID_LIBS="$ROOT_DIR/android-libs"
OBJS="$ROOT_DIR/objs"
if [ "$DEST" = "" ]; then
    rm -rf $ROOT_DIR/build/stagefright
    mkdir -p $ROOT_DIR/build/stagefright
    DEST=$ROOT_DIR/build/stagefright
fi

#for ABI in "armeabi-v7a" "armeabi" "x86"; do
for ABI in "armeabi-v7a" "armeabi"; do
    if [ "$ABI" = "x86" ]; then
        ARCH="x86"
        TOOLCHAIN=`echo $NDK/toolchains/x86-4.9/prebuilt/*-x86*`
    else
        ARCH="arm"
        TOOLCHAIN=`echo $NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/*-x86*`
    fi 
    SYSROOT=$NDK/platforms/android-18/arch-$ARCH
    # Expand the prebuilt/* path into the correct one
    export PATH=$TOOLCHAIN/bin:$PATH

    FLAGS="--target-os=linux --arch=$ARCH"
    FLAGS="$FLAGS --sysroot=$SYSROOT"
    FLAGS="$FLAGS --enable-shared --disable-doc --disable-ffplay --disable-ffprobe --disable-ffserver --disable-symver"
    if [ "$ARCH" = "arm" ]; then
        FLAGS="$FLAGS --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- --cpu=armv7-a --enable-libstagefright-h264"
        #FLAGS="$FLAGS --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- --cpu=armv7-a"
    else
        FLAGS="$FLAGS --cross-prefix=$TOOLCHAIN/bin/i686-linux-android- --disable-asm"
    fi

    EXTRA_CFLAGS="-I$DEST/$ABI/include"
    EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/base/include -I$ANDROID_SOURCE/system/core/include"
    EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/native/include"
    EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/native/include/media/openmax"
    EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/av/include"
    EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/av/media/libstagefright"
    EXTRA_CFLAGS="$EXTRA_CFLAGS -I$NDK/sources/cxx-stl/gnu-libstdc++/4.9/include -I$NDK/sources/cxx-stl/gnu-libstdc++/4.9/libs/$ABI/include"
    EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/hardware/libhardware/include"
    if [ "$ARCH" = "arm" ]; then
        EXTRA_CFLAGS="$EXTRA_CFLAGS -march=armv7-a -mfloat-abi=softfp -mfpu=neon -Wl,--no-undefined" #-Werror=implicit-function-declaration"
    fi
    EXTRA_LDFLAGS="-Wl,--fix-cortex-a8 -L$ANDROID_LIBS -Wl,-rpath-link,$ANDROID_LIBS -L$NDK/sources/cxx-stl/gnu-libstdc++/4.9/libs/$ABI"
    EXTRA_CXXFLAGS="-Wno-multichar -fno-exceptions -fno-rtti"
    FLAGS="$FLAGS --prefix=$DEST/$ABI"

    mkdir -p $DEST/$ABI
    mkdir -p $OBJS/$ABI

    echo $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" --extra-cxxflags="$EXTRA_CXXFLAGS" > $DEST/$ABI/info.txt
    echo "Configuring ..."
    cd $OBJS/$ABI
    $ROOT_DIR/configure $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" --extra-cxxflags="$EXTRA_CXXFLAGS" | tee $DEST/$ABI/configuration.txt
    [ $PIPESTATUS == 0 ] || exit 1
    echo "Making ..."
    #make clean
    make -j4 || exit 1
    make install || exit 1
    cd $CUR_DIR
done

您可以使用最新的NDK,仅将平台设置为android-19,而不是最新的android-21

你使用一些图书馆,它们太好了。例如,从那里得到一个libm,它有log2。相反,您需要支持的设备上libm.so版本的最小公分母。你不需要寻找这样的图书馆;你有NDK的官方版本


我知道要启用硬件编解码器,您需要一些非官方的lib。但要小心,将包含已下载libs的目录放在查找列表的末尾。或者更安全的做法是,只复制像libcutils.com这样的少数库,以便您的链接真正需要。

您构建的是哪种ffmpeg?您是如何配置的?ffmpeg 2.4.3。我通过添加用于配置的脚本代码对问题进行了编辑。在我的config.log中,我看到了显示log2f不存在的检查。这导致HAVE_LOG2F未定义,libavutils/libm.h使用define log2fx floatlog2x。这就是我的构建在Android 4上的工作原理。谢谢Alex,它终于工作了!如何:我切换到另一组库,它们是三星Galaxy S3安卓4.0.4中提供的库。当然,因为在libm.so中没有log2和log2f,现在我没有得到内置警告,也没有链接错误预期行为!。在任何情况下,我都想知道当应用程序使用NDK编译时是如何实现的,NDK的功能在低于NDK工具链的Android设备版本的系统库中没有实现。啊,我忘了提到:在Android 5上,它不工作了,很遗憾,我正期待着这一点。错误是:失败:dlopen失败:找不到libavcodec引用的符号\u zn7android16mediabuffergroup14获取\u bufferEPPNS\u 11mediabuffer。因此…恐怕我解释得不够清楚。NDK为每个平台提供了一组库,代表该平台的合同。也就是说,如果您使用android平台8中的libm.so,那么2.2及更高版本中的任何设备都将具有libm.so,因此这将是向后兼容的。我强烈建议您只使用构建所需的少数缺失的系统库,而不要覆盖NDK附带的系统库。关于MediaBuffer,这是一个非官方库不向后兼容的示例。最简单的方法是为棒棒糖创建一个单独的libavcodec.so。棘手的方法是构建一个适配器库,用于为两个库调优一个库。我明白了,这是有意义的!再次感谢: