Android 编译 FFmpeg 产生「error undefined reference to ‘av_register_all()」等错误的多种原因

本文主要内容:讲述遇到集成 NDK 时遇到的「error: undefined reference to」的解决方案

集成 NDK 有很多方式,比如 ndk-build 后把 so 库直接链接使用,或者通过 CMake 的方式链接,通常推荐后者,因为这样编写调用 native 方法方便,不需要像前者每次需要重新打包。
在实现 FFmpeg 播放视频功能时,我参考 Android Studio FFmpeg视频解码播放 该文章操作后,始终无法成功编译,按照网上的种种解决方案(比如用 C 的方式引入头文件)都无法解决,最后一步一步跟能成功运行的项目对照后终于解决。

具体报错情况为一堆 FFmpeg 相关的方法提示 「error: undefined reference to XXXX」。网上的解决方案基本都为用「extern “C”{}」包裹,原因是 FFmpeg 是一共纯 C 的项目,C++ 想正确调用 C 代码则需使用这样的方式,具体示例如下:

extern "C"
{
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
#include "libswresample/swresample.h"
#include "libavutil/opt.h"
#include "libavutil/imgutils.h"
}

该方案能解决一部分人问题,于我却无用,随后我检查了各种引入方式,以及 NDK 的语法后,确定问题其实是出在 CMakelists.txt 文件上。

先附上正确的 CMake 文件:

cmake_minimum_required(VERSION 3.4.1)

set(distribution_DIR ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI})

include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/include)


add_library( avutil-55
             SHARED
             IMPORTED )
set_target_properties( avutil-55
                       PROPERTIES IMPORTED_LOCATION
                       ${distribution_DIR}/libavutil-55.so )

add_library( swresample-2
             SHARED
             IMPORTED )
set_target_properties( swresample-2
                       PROPERTIES IMPORTED_LOCATION
                       ${distribution_DIR}/libswresample-2.so )
add_library( avcodec-57
             SHARED
             IMPORTED )
set_target_properties( avcodec-57
                       PROPERTIES IMPORTED_LOCATION
                       ${distribution_DIR}/libavcodec-57.so )
add_library( avfilter-6
             SHARED
             IMPORTED)
set_target_properties( avfilter-6
                       PROPERTIES IMPORTED_LOCATION
                       ${distribution_DIR}/libavfilter-6.so )
add_library( swscale-4
             SHARED
             IMPORTED)
set_target_properties( swscale-4
                       PROPERTIES IMPORTED_LOCATION
                       ${distribution_DIR}/libswscale-4.so )

add_library( avformat-57
             SHARED
             IMPORTED)
set_target_properties( avformat-57
                       PROPERTIES IMPORTED_LOCATION
                       ${distribution_DIR}/libavformat-57.so )



#add_library( native-lib
#             SHARED
#             src/main/cpp/native-lib.cpp )

add_library( ffmpeg-lib
             SHARED
             ${CMAKE_SOURCE_DIR}/src/main/cpp/ffmpeg-lib.cpp )

#find_library( log-lib
#              log )

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")

target_link_libraries(
                       ffmpeg-lib
                       avutil-55
                       swresample-2
                       avcodec-57
                       avfilter-6
                       swscale-4
                       avformat-57
                       log
                       android
                       )

我犯的错误之一是为了区分我自己新建了 ffmpeg-lib 来写相关的代码,却两次 add_library 了,实际上写法应该是同一个 add_library,最后一部分引入多个 cpp 文件。
犯的错误之二是第一次接触 CMake,因此代码是照着别人改的,但是 target_link_libraries 的时候少链接了一个 so库。

这里的错误其实挺隐蔽的,因为之前集成 FFmpeg 的时候项目 Hello world 时一切正常,而后具体写代码时却出问题了,因此一直把注意力集中在代码上面。我搜到的网上的所有相关资料都没有提示可能与 CMake 有关,因此写下此文供后人参考。

顺带补充一个尴尬的小错误,在运行的时候 loadLibrary 时提示「java.lang.UnsatisfiedLinkError: dlopen failed: library “libavcodec-58.so” not found」,我一度以为又是我 CMake 写错了,结果发现是因为最开始把 so 库放到了 libs 文件夹下,后来在排查上面错误时改到了 src/main/jniLibs 底下,而 gradle 文件没有同步更改,gradle 的 jniLibs.srcDirs 修改目录即可:

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

评论

  1. 4年前
    2019-12-05 2:48:24
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    Metal

  2. 4年前
    2019-12-05 3:38:12
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    Extensions

  3. 4年前
    2019-12-05 4:34:15
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    Cheese

  4. 4年前
    2019-12-06 23:54:34
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    Dong

  5. 4年前
    2019-12-09 2:28:39
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    Unbranded Plastic Table

  6. 4年前
    2019-12-10 5:40:30
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    eyeballs

  7. 4年前
    2019-12-16 17:23:35
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    matrix

  8. 4年前
    2019-12-16 22:56:38
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    Applications

  9. 4年前
    2019-12-18 19:24:44
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    Plaza

  10. 4年前
    2019-12-22 9:05:18
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    Cayman Islands Dollar

  11. 4年前
    2019-12-29 2:11:54
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    invoice

  12. 4年前
    2019-12-31 6:48:19
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    Program

  13. 4年前
    2020-1-04 23:02:29
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    Synchronised

  14. 4年前
    2020-1-15 17:59:45
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    Money Market Account

  15. 4年前
    2020-1-17 9:11:45
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    mesh

  16. 4年前
    2020-1-23 11:31:02
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    compress

  17. 4年前
    2020-1-24 8:37:28
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    Avon

  18. 4年前
    2020-1-26 5:46:27
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    Malagasy Ariary

  19. SQL
    4年前
    2020-1-28 23:13:16
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    Fish

  20. 4年前
    2020-2-11 15:24:06
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    responsive

  21. 4年前
    2020-2-11 17:51:34
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    Intelligent Plastic Salad

  22. 4年前
    2020-2-12 0:23:55
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    SDD

  23. 4年前
    2020-2-20 16:05:42
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    Analyst

  24. 4年前
    2020-2-25 0:54:57
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    Home Loan Account

  25. SSL
    4年前
    2020-2-26 2:09:38
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    evolve

  26. 4年前
    2020-3-03 4:07:55
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    Motorway

  27. 4年前
    2020-3-10 15:46:08
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    Ohio

  28. 4年前
    2020-3-10 17:37:24
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    function

  29. 4年前
    2020-3-22 11:53:25
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    HTTP

  30. 4年前
    2020-3-29 4:36:16
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    haptic

  31. 4年前
    2020-4-21 0:49:00
    Google Chrome 73.0.3683.86 Google Chrome 73.0.3683.86 Windows 10 x64 Edition Windows 10 x64 Edition

    Data

  32. 4年前
    2020-4-30 9:15:16
    Google Chrome 78.0.3882.0 Google Chrome 78.0.3882.0 GNU/Linux x64 GNU/Linux x64

    COM

  33. ADP
    4年前
    2020-5-01 21:03:33
    Google Chrome 78.0.3882.0 Google Chrome 78.0.3882.0 GNU/Linux x64 GNU/Linux x64

    Toys

  34. Web
    4年前
    2020-5-02 22:11:15
    Google Chrome 78.0.3882.0 Google Chrome 78.0.3882.0 GNU/Linux x64 GNU/Linux x64

    Virtual

  35. 4年前
    2020-5-05 18:37:56
    Google Chrome 78.0.3882.0 Google Chrome 78.0.3882.0 GNU/Linux x64 GNU/Linux x64

    Tuna

  36. 4年前
    2020-5-15 6:27:07
    Google Chrome 81.0.4044.0 Google Chrome 81.0.4044.0 GNU/Linux x64 GNU/Linux x64

    alliance

  37. 4年前
    2020-5-24 11:18:38
    Google Chrome 81.0.4044.0 Google Chrome 81.0.4044.0 GNU/Linux x64 GNU/Linux x64

    JSON

  38. 4年前
    2020-5-29 4:18:30
    Google Chrome 79.0.3945.0 Google Chrome 79.0.3945.0 GNU/Linux x64 GNU/Linux x64

    optical

  39. 4年前
    2020-6-03 10:07:13
    Google Chrome 79.0.3945.0 Google Chrome 79.0.3945.0 GNU/Linux x64 GNU/Linux x64

    collaboration

  40. 4年前
    2020-6-05 5:55:10
    Google Chrome 71.0.3563.0 Google Chrome 71.0.3563.0 GNU/Linux x64 GNU/Linux x64

    end-to-end

  41. 4年前
    2020-6-09 20:23:37
    Google Chrome 71.0.3563.0 Google Chrome 71.0.3563.0 GNU/Linux x64 GNU/Linux x64

    systematic

  42. 4年前
    2020-6-10 5:12:30
    Google Chrome 71.0.3563.0 Google Chrome 71.0.3563.0 GNU/Linux x64 GNU/Linux x64

    Borders

  43. 4年前
    2020-6-10 6:15:33
    Google Chrome 71.0.3563.0 Google Chrome 71.0.3563.0 GNU/Linux x64 GNU/Linux x64

    hack

  44. 4年前
    2020-6-19 2:16:31
    Google Chrome 71.0.3563.0 Google Chrome 71.0.3563.0 GNU/Linux x64 GNU/Linux x64

    Secured

  45. 4年前
    2020-6-27 10:08:12
    Google Chrome 71.0.3563.0 Google Chrome 71.0.3563.0 GNU/Linux x64 GNU/Linux x64

    Factors

  46. 4年前
    2020-6-30 22:09:46
    Google Chrome 71.0.3563.0 Google Chrome 71.0.3563.0 GNU/Linux x64 GNU/Linux x64

    Plastic

  47. 4年前
    2020-7-05 18:06:11
    Google Chrome 71.0.3563.0 Google Chrome 71.0.3563.0 GNU/Linux x64 GNU/Linux x64

    1080p

  48. 4年前
    2020-7-08 5:09:14
    Google Chrome 71.0.3563.0 Google Chrome 71.0.3563.0 GNU/Linux x64 GNU/Linux x64

    niches

  49. 4年前
    2020-7-20 8:21:58
    Google Chrome 71.0.3563.0 Google Chrome 71.0.3563.0 GNU/Linux x64 GNU/Linux x64

    matrix

  50. 4年前
    2020-7-22 19:24:39
    Google Chrome 71.0.3563.0 Google Chrome 71.0.3563.0 GNU/Linux x64 GNU/Linux x64

    Mouse

  51. 4年前
    2020-8-06 6:13:33
    Google Chrome 71.0.3563.0 Google Chrome 71.0.3563.0 GNU/Linux x64 GNU/Linux x64

    Tasty

  52. 4年前
    2020-8-27 2:05:14
    Google Chrome 71.0.3563.0 Google Chrome 71.0.3563.0 GNU/Linux x64 GNU/Linux x64

    Balanced

  53. 4年前
    2020-8-30 4:07:08
    Google Chrome 71.0.3563.0 Google Chrome 71.0.3563.0 GNU/Linux x64 GNU/Linux x64

    PNG

  54. 4年前
    2020-8-30 10:44:43
    Google Chrome 71.0.3563.0 Google Chrome 71.0.3563.0 GNU/Linux x64 GNU/Linux x64

    Toys

  55. 4年前
    2020-9-09 1:43:23
    Google Chrome 71.0.3563.0 Google Chrome 71.0.3563.0 GNU/Linux x64 GNU/Linux x64

    Refined Steel Ball

  56. 4年前
    2020-9-10 3:34:22
    Google Chrome 71.0.3563.0 Google Chrome 71.0.3563.0 GNU/Linux x64 GNU/Linux x64

    Baby

  57. EXE
    4年前
    2020-9-11 6:41:05
    Google Chrome 71.0.3563.0 Google Chrome 71.0.3563.0 GNU/Linux x64 GNU/Linux x64

    Loaf

  58. 3年前
    2020-10-19 2:02:39
    Google Chrome 71.0.3563.0 Google Chrome 71.0.3563.0 GNU/Linux x64 GNU/Linux x64

    Trafficway

  59. 3年前
    2020-10-26 21:34:23
    Google Chrome 71.0.3563.0 Google Chrome 71.0.3563.0 GNU/Linux x64 GNU/Linux x64

    infrastructures

  60. 3年前
    2020-10-29 1:32:38
    Google Chrome 71.0.3563.0 Google Chrome 71.0.3563.0 GNU/Linux x64 GNU/Linux x64

    hack

  61. 3年前
    2020-11-03 8:27:44
    Google Chrome 71.0.3563.0 Google Chrome 71.0.3563.0 GNU/Linux x64 GNU/Linux x64

    Toys

  62. 3年前
    2020-11-07 23:23:25
    Google Chrome 71.0.3563.0 Google Chrome 71.0.3563.0 GNU/Linux x64 GNU/Linux x64

    exuding

  63. 3年前
    2020-11-08 15:17:50
    Google Chrome 71.0.3563.0 Google Chrome 71.0.3563.0 GNU/Linux x64 GNU/Linux x64

    wireless

  64. 3年前
    2020-11-16 21:41:17
    Google Chrome 71.0.3563.0 Google Chrome 71.0.3563.0 GNU/Linux x64 GNU/Linux x64

    solution

  65. 3年前
    2020-11-26 23:05:41
    Google Chrome 71.0.3563.0 Google Chrome 71.0.3563.0 GNU/Linux x64 GNU/Linux x64

    Small Fresh Computer

  66. 3年前
    2020-12-05 1:23:33
    Google Chrome 71.0.3563.0 Google Chrome 71.0.3563.0 GNU/Linux x64 GNU/Linux x64

    Spring

  67. 3年前
    2020-12-11 20:11:36
    Google Chrome 71.0.3563.0 Google Chrome 71.0.3563.0 GNU/Linux x64 GNU/Linux x64

    GB

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇