【问题标题】:Compile error for a simple library in Android using latest FFmpeg library with NDK使用最新的 FFmpeg 库和 NDK 编译 Android 中的简单库时出错
【发布时间】:2017-08-10 23:39:05
【问题描述】:

我正在尝试让 FFmpeg 在 Android 中运行,并在 Ubuntu 64bit 上成功编译后,并在 source/ffmpeg-3.4.2/android/arm 文件夹下创建了 Android.mk 和也是我自己的Android项目中的Android.mk !我无法编译一个简单的程序并创建 .so 文件! 顺便说一句,我已经在网上和 Stackoverflow 中搜索了 2 天,但没有运气! 这是代码 Android.mk

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := MyLibrary
LOCAL_SRC_FILES := MyNativeFunctions.c
LOCAL_LDLIBS := -lz -llog
LOCAL_STATIC_LIBRARIES := libavformat_static libavcodec_static libavutil_static
include $(BUILD_SHARED_LIBRARY)

$(call import-module,ffmpeg-3.2.4/android/arm)

原生函数

    #include <libavformat/avformat.h>
    #include <libavcodec/avcodec.h>
    #include <libavutil/avutil.h>

    #include <android/log.h>
    #define LOG_TAG "mylib"
    #define LOGI(...)  __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
    #define LOGE(...)  __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
    jint Java_com_example_home_hellondk_MyNativeFunctions_TestNdk(JNIEnv * env, jobject this, jstring filename)
    {
         av_register_all();

return 0;
}

当我使用 NDK-BUILD 时,这是我得到的错误:

/home/home/Android/Sdk/ndk-bundle/sources/ffmpeg-3.2.4/android/arm/lib/libavformat.a: error adding symbols: File in wrong format
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [obj/local/arm64-v8a/libMyLibrary.so] Error 1

[编辑] Build_android.sh

#!/bin/bash
NDK=/home/home/Android/Sdk/ndk-bundle
SYSROOT=$NDK/platforms/android-24/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
 function build_one
{
./configure \
--prefix=$PREFIX \
--disable-shared \
--enable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one

[编辑] 问题已通过添加缺少的库解决 LOCAL_STATIC_LIBRARIES := libavformat_static libavcodec_static libswscale_static libavutil_static libswresample_static 对于 Android Studio 的所有用户,不要忘记将此行添加到您的 gradle 中,否则它将无法正常工作。

sourceSets.main {
        jni.srcDirs = []
        jniLibs.srcDir 'src/main/libs'
    }

最好的问候

【问题讨论】:

  • 你是如何构建 libavformat 的?
  • @DanAlbert:请检查更新“Build_android.sh”
  • 如果我删除 av_register_all() 它工作正常!我不明白问题出在哪里!?

标签: android ubuntu ffmpeg android-ndk 64-bit


【解决方案1】:

您只是为 arm32 构建 ffmpeg,但您正在为所有 ABI 构建您的应用程序。

在您的 ffmpeg 构建脚本中,您专门针对 arm:

SYSROOT=$NDK/platforms/android-24/arch-arm/

从错误输出中你可以看到它正在构建 arm64:

make: *** [obj/local/arm64-v8a/libMyLibrary.so] Error 1

将您的 ndk-build 限制为仅构建 arm32(Application.mk 中的APP_ABI := armeabi-v7a)或为其他架构构建 ffmpeg。

顺便说一句,如果您使用https://developer.android.com/ndk/guides/standalone_toolchain.html,您将更轻松地使用 NDK 构建 autoconf 项目

【讨论】:

  • 非常感谢您的支持!对此,我真的非常感激 !你是对的,但现在我收到了一个新错误:libavformat/hls.c:762: 错误:未定义对“atof”libavformat/hlsenc.c:454 的引用:错误:未定义对“atof”libavformat/webmdashenc 的引用。 c:85:错误:未定义对'atof'l的引用............ make:*** [obj/local/armeabi-v7a/libMyLibrary.so]错误1
  • 我添加了:APP_PLATFORM := android-24,现在我得到了一些其他错误 libavcodec/opusdec.c:379: error: undefined reference to 'swr_is_initialized' 这是什么意思!?跨度>
  • Opus 依赖于 libswresample。将此库添加到 source/ffmpeg-3.4.2/android/arm/Android.mk 中的 LOCAL_EXPORTED_STATIC_LIBRARIES 列表中,或者在配置 ffmpeg 时指定 --disable-decoder-opus
  • 感谢@Dan 的帮助,问题已经解决,我已经添加了 libswresample_static libswscale_static,现在可以正常编译了。非常感谢 APP_ABI 的提示 := armeabi-v7a 非常有帮助
猜你喜欢
  • 2012-08-29
  • 2016-09-25
  • 2012-12-21
  • 2011-07-09
  • 1970-01-01
  • 2015-01-05
  • 2016-12-15
  • 2023-02-22
  • 2014-12-02
相关资源
最近更新 更多