在为Android Studio 2.2构建FFmpeg 3.2时出现“imported-lib - NOTFOUND”错误。

4

我正在尝试构建并使用适用于Android的ffmpeg。我的Andoid Studio版本是2.2.2,ffmpeg版本是3.2。按照Android文档中有关导入重构库的说明,我认为我已经正确设置了,但仍然不断出现此错误。

ninja: error: 'avcodec-NOTFOUND', needed by '../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/...

这是设置。
add_library( avcodec SHARED IMPORTED )
add_library( avdevice SHARED IMPORTED )
add_library( avfilter SHARED IMPORTED )
add_library( avformat SHARED IMPORTED )
add_library( avutil SHARED IMPORTED )
add_library( swscale SHARED IMPORTED )

set_target_properties( avcodec
                        PROPERTIES FFMPEG_LIB_IMPORTED_LOCATION
                        libs/ffmpeg/${ANDROID_ABI}/lib/libavcodec.so
                        )
set_target_properties(  avdevice
                        PROPERTIES FFMPEG_LIB_IMPORTED_LOCATION
                        libs/ffmpeg/${ANDROID_ABI}/lib/libavdevice.so
                        )
set_target_properties( avfilter
                        PROPERTIES FFMPEG_LIB_IMPORTED_LOCATION
                        libs/ffmpeg/${ANDROID_ABI}/lib/libavfilter.so
                        )
set_target_properties( avformat
                        PROPERTIES FFMPEG_LIB_IMPORTED_LOCATION
                        libs/ffmpeg/${ANDROID_ABI}/lib/libavformat.so
                        )
set_target_properties( avutil
                        PROPERTIES FFMPEG_LIB_IMPORTED_LOCATION
                        libs/ffmpeg/${ANDROID_ABI}/lib/libavutil.so
                        )
set_target_properties( swscale
                        PROPERTIES FFMPEG_LIB_IMPORTED_LOCATION
                        libs/ffmpeg/${ANDROID_ABI}/lib/libswscale.so
                        )

# Specifies a path to native header files.
include_directories(
                    libs/ffmpeg/${ANDROID_ABI}/include
                    )

target_link_libraries( # Specifies the target library.
                       native-lib

                       # Links the target library to the log library
                       # included in the NDK.
                       avcodec avdevice avfilter avformat avutil swscale
                       ${log-lib}
                        )

如果我指定完整的库名称,例如libavcodec.so...,错误将会消失。
target_link_libraries( # Specifies the target library.
                       native-lib

                       # Links the target library to the log library
                       # included in the NDK.
                       libavcodec.so libavdevice.so libavfilter.so libavformat.so libavutil.so libswscale.so
                       ${log-lib}
                        )

我想知道是否有人遇到了类似的问题或者知道为什么编译会出现这种情况。


1
find_library搜索库失败时,通常会产生值为*-NOTFOUND。因为您的代码没有使用此函数,所以看起来其他一些代码尝试迭代链接到native-lib中的库并搜索它们。顺便说一下,您导入的某些库位于lib/下,而其他库位于libs/下。这是有意为之吗?另外,avfilter库使用${ANDROID_ABI}lib路径组件,而其他库使用${ANDROID_ABI}/lib - Tsyvarev
Tsyvarev,您指出的内容是错别字。导入的库应该在libs/中。路径组件应该是${ANDROID_ABI}/lib。我进行了更正并得到了相同的结果。谢谢。 - mdang
1
我不熟悉Android,但是对于与CMake的“正常”链接,您需要设置IMPORTED_LOCATION属性(无需FFMPEG_LIB_前缀)。此外,此属性的值应为绝对路径 - Tsyvarev
Tsyvarev,你针对我的问题给出的两个新点是正确的。我已经进行了修改,根据Android文档进行了编译和链接。我会为此添加一个答案部分。 - mdang
1个回答

2
根据Tsyvarev的输入,我在这里进行了编译和链接。
add_library( avcodec SHARED IMPORTED )
add_library( avdevice SHARED IMPORTED )
add_library( avfilter SHARED IMPORTED )
add_library( avformat SHARED IMPORTED )
add_library( avutil SHARED IMPORTED )
add_library( swscale SHARED IMPORTED )

set_target_properties( avcodec
                        PROPERTIES IMPORTED_LOCATION
                        ../../../../libs/${ANDROID_ABI}/lib/libavcodec.so
                        )
set_target_properties(  avdevice
                        PROPERTIES IMPORTED_LOCATION
                      ../../../../libs/${ANDROID_ABI}/lib/libavdevice.so
                        )
set_target_properties( avfilter
                        PROPERTIES IMPORTED_LOCATION
                        ../../../..//libs/${ANDROID_ABI}/lib/libavfilter.so
                        )
set_target_properties( avformat
                        PROPERTIES IMPORTED_LOCATION
                        ../../../../libs/${ANDROID_ABI}/lib/libavformat.so
                        )
set_target_properties( avutil
                        PROPERTIES IMPORTED_LOCATION
                        ../../../../libs/${ANDROID_ABI}/lib/libavutil.so
                        )
set_target_properties( swscale
                        PROPERTIES IMPORTED_LOCATION
                        ../../../../libs/${ANDROID_ABI}/lib/libswscale.so
                        )

# Specifies a path to native header files.
include_directories(
                    libs/${ANDROID_ABI}/include
                    )

target_link_libraries( # Specifies the target library.
                       native-lib

                       # Links the target library to the log library
                       # included in the NDK.
                       avcodec avdevice avfilter avformat avutil swscale
                       ${log-lib}
                        )

请注意以下重要区别:
  • set_target_properties 中,路径需要是绝对路径。例如,这里使用了 "../../../../" 四级目录来到 libs 目录;然而,在 include_directory 中的头文件路径需要是相对路径。我使用了绝对路径,但无法找到包含文件。顺便说一下,我删除了 'ffmpeg' 文件夹。

  • set_target_properties 中的导入位置属性需要是 IMPORTED_LOCATION


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接