在Android中使用最新的FFmpeg库编译NDK的库简单的库文件

问题描述:

我试图让FFmpeg工作在Android上,并成功编译后在Ubuntu 64bit,并创建了源码下的Android.mk/ffmpeg- 3.4.2/android/arm文件夹以及我自己的Android项目中的Android.mk !我无法编译一个简单的程序并创建.so文件! 顺便说一句,我搜索了网络和* 2天现在没有运气! 这里是代码Android.mk在Android中使用最新的FFmpeg库编译NDK的库简单的库文件

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' 
    } 

问候

+0

您是如何建立了libavformat你必须与NDK更轻松地构建autoconf的项目? –

+0

@DanAlbert:请检查更新“Build_android.sh” – satyres

+0

如果我删除av_register_all()它工作正常!我无法理解问题在哪里!? – satyres

你只是建设ARM32 ffmpeg的,但你建立你的应用程序为所有的ABI。在你的ffmpeg构建脚本

在这里,我们专门针对手臂:

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

而且从错误输出,你可以看到它是建设arm64:

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

要么限制你的NDK建造在您的Application.mk中只构建arm32(APP_ABI := armeabi-v7a),或为其他体系结构构建ffmpeg。

顺便说一句,如果你使用https://developer.android.com/ndk/guides/standalone_toolchain.html

+0

非常感谢您的支持!对此,我真的非常感激 !你是对的,但现在我得到一个新的错误:libavformat/hls.c:762:错误:未定义引用'atof' libavformat/hlsenc.c:454:错误:未定义引用'atof'012avlibavformat/webmdashenc.c:85:error:undefined reference to'atof' l .................. make:*** [obj/local/armeabi-v7a/libMyLibrary .so]错误1 – satyres

+0

我添加了:APP_PLATFORM:= android-24,现在我得到一些其他错误libavcodec/opusdec。c:379:错误:未定义引用'swr_is_initialized'这是什么意思!? – satyres

+0

Opus取决于** libswresample **。将此库添加到source/ffmpeg-3.4.2/android/arm/Android.mk中的LOCAL_EXPORTED_STATIC_LIBRARIES列表中,或者在配置** ffmpeg **时指定'--disable-decoder-opus'。 –