在 Android 上使用 ffmpeg 2.1.1 时出现未定义的引用

2023-12-24

我正在按照与以下相同的模式构建 ffmpeg半忍者的构建 https://github.com/halfninja/android-ffmpeg-x264:制作 ffmpeg 的main可通过 JNI 从 Java 获取。我使用以下选项构建了 ffmpeg:

./configure \
    --prefix=$PREFIX \
    --disable-shared \
    --enable-static \
    --disable-doc \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --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"

$PREFIX, TOOLCHAIN, ... 被设置为我的 NDK 中的相应文件夹。$ADDI_CFLAGS被设定为-marm and $ADDI_LDFLAGS and $ADDITIONAL_CONFIGURE_FLAGS均未设置。创建生成的静态库:


$ ls -1 android/arm/lib/
libavcodec.a
libavdevice.a
libavfilter.a
libavformat.a
libavutil.a
libswresample.a
libswscale.a
pkgconfig  

我用一个Android.mk文件,内置 ffmpeg$NDK/sources/ffmpeg-2.1.1:

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE:= libavdevice
LOCAL_SRC_FILES:= lib/libavdevice.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE:= libavcodec
LOCAL_SRC_FILES:= lib/libavcodec.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE:= libavformat
LOCAL_SRC_FILES:= lib/libavformat.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE:= libswscale
LOCAL_SRC_FILES:= lib/libswscale.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE:= libavutil
LOCAL_SRC_FILES:= lib/libavutil.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE:= libavfilter
LOCAL_SRC_FILES:= lib/libavfilter.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE:= libwsresample
LOCAL_SRC_FILES:= lib/libswresample.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY)

所以,到目前为止,一切看起来都很好。现在,我尝试构建ffmpeg相当于静态库的二进制文件。我复制了(暂时没有改变任何一个字符)ffmpeg.c, ffmpeg.h, cmdutils.c, cmdutils.h, ffmpeg_opt.cand ffmpeg_filter.c in my jni文件夹。我在这个文件夹中还有两个直接与 JNI 相关的文件(从 halfninja 的构建复制而来,我只是更改了包名称)。这是相关的Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_C_INCLUDES := /Applications/android-ndk-r9b/sources/ffmpeg-2.1.1
LOCAL_CFLAGS := -Wdeprecated-declarations
LOCAL_MODULE := videokit
ANDROID_LIB := -landroid
LOCAL_LDLIBS += -llog -ljnigraphics -lz 
LOCAL_SRC_FILES := videokit/com_rfc_video_ffmpeg_Videokit.c videokit/ffmpeg.c videokit/cmdutils.c videokit/ffmpeg_opt.c videokit/ffmpeg_filter.c
LOCAL_SHARED_LIBRARIES := libavdevice libavformat libavfilter libavcodec libwscale libavutil libswresample libswscale libpostproc
include $(BUILD_SHARED_LIBRARY)
$(call import-module,ffmpeg-2.1.1/android/arm)

一切都编译得很好,但没有链接。以下是第一个错误:


[armeabi] SharedLibrary  : libvideokit.so
/Applications/android-ndk-r9b/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/videokit/videokit/cmdutils.o: in function print_all_libs_info.constprop.5:jni/videokit/cmdutils.c:1063: error: undefined reference to 'swresample_version'
/Applications/android-ndk-r9b/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/videokit/videokit/cmdutils.o: in function print_all_libs_info.constprop.5:jni/videokit/cmdutils.c:1063: error: undefined reference to 'swresample_configuration'
/Applications/android-ndk-r9b/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/videokit/videokit/cmdutils.o: in function opt_default:jni/videokit/cmdutils.c:558: error: undefined reference to 'swr_get_class'
/Applications/android-ndk-r9b/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/videokit/videokit/cmdutils.o: in function opt_default:jni/videokit/cmdutils.c:561: error: undefined reference to 'swr_alloc'
/Applications/android-ndk-r9b/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/videokit/videokit/cmdutils.o: in function opt_default:jni/videokit/cmdutils.c:563: error: undefined reference to 'swr_free'
/Applications/android-ndk-r9b/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/videokit/videokit/ffmpeg_opt.o: in function show_help_default:jni/videokit/ffmpeg_opt.c:2464: error: undefined reference to 'swr_get_class'  

我不明白的是这些函数是在中定义和可用的libswresample.a,我链接到:


arm-linux-androideabi-nm /Applications/android-ndk-r9b/sources/ffmpeg-2.1.1/android/arm/lib/libswresample.a  | grep -i -e swr_get_class -e swresample_version
000001d4 T swr_get_class
00000178 T swresample_version  

我究竟做错了什么?是否有另一种可能更简单的方法将 ffmpeg 公开为通过 JNI 可用的静态库? (我不使用halfninja的,因为我至少需要ffmpeg 1.1,而他的是0.9)。


你的名字有点乱:在一个地方,你这样称呼它libwsresample, 其他地方libswresample.

检查所有名称的一致性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Android 上使用 ffmpeg 2.1.1 时出现未定义的引用 的相关文章

  • 将 C# 反射代码移植到 Metro-Ui

    我正在尝试移植使用反射的现有 C 类 通用工厂 但我无法编译这段代码 Type types Assembly GetAssembly typeof TProduct GetTypes foreach Type type in types i
  • C 中的模仿函数重写

    具体来说 函数重写能够调用基本重写方法 这有两部分 一个是预编译的库代码 1 另一个是库的用户代码 2 我在这里实现了一个尽可能最小的经典 Person 和 Employee 示例 非常感谢了解 OOP 概念的铁杆 C 开发人员的回应 我正
  • 如何通过子 POJO 的属性过滤复合 ManyToMany POJO?

    我有两个像这样的房间实体 Entity public class Teacher implements Serializable PrimaryKey autoGenerate true public int id ColumnInfo n
  • 使用反射获取基类的受保护属性值

    I would like to know if it is possible to access the value of the ConfigurationId property which is located in the base
  • 在“using”语句中使用各种类型 (C#)

    自从C usingstatements只是try finally dispose 的语法糖 为什么它接受多个对象仅当它们属于同一类型时 我不明白 因为它们需要的只是 IDisposable 如果它们都实现 IDisposable 应该没问题
  • 在哪里可以获得用于导入 libcore.io 的 JAR?

    我想处理一个GaiException在我的应用程序中 调试器告诉我 它位于 libcore io 包中 但导入它会产生错误 我想我需要向我的项目添加一个额外的 JAR 才能正确解析此类型 我在我的 android sdk 文件夹中进行了一些
  • 使用scanf()时如何区分整数和字符

    我只是使用该功能scanf 代码如下 scanf d a printf d a 当我输入1时 它会像我想要的那样打印1 但即使我输入 1a 它也会像以前一样打印 1 当用户输入非整数时 例如 2 3 12ab 1 a 我想向用户显示 输入整
  • 不要声明只读可变引用类型 - 为什么不呢?

    我一直在阅读这个问题 https stackoverflow com questions 2274412 immutable readonly reference types fxcop violation do not declare r
  • 如何在kotlin中使用Coroutine每秒调用一个函数

    我刚刚创建了一个应用程序 其中我的函数 getdata 每秒调用一次以从服务器获取新数据 而 updateui 函数将更新 UI 中的视图 我在我的应用程序中不使用任何异步任务或协程 我想这样做 请告诉我我怎样才能做到这一点 这是我的代码
  • 如何使用百分比进行android布局?

    我们如何使用百分比android视图元素的值 像这样的东西
  • 使用 qbs 构建 qt 应用程序

    我想知道在 Linux 上使用 qbs 编译 构建和创建 Android Qt 应用程序的步骤 我拥有所有必要的工具 目前我可以使用 qmake 创建 apk Qbs 目前不支持构建 Qt Android 应用程序 Qbs v1 4 中引入
  • 查找配对的 Android 蓝牙设备是否在范围内的正确方法?

    我想编写一个充当蓝牙客户端的应用程序 我想做的是找出最好的方法来确定我支持的特定设备是否在范围内 而不是一直尝试在其上执行 BluetoothDevice connect 并失败如果不在范围内 这里我们假设设备已经配对 恐怕在特定设备处于范
  • Google Cloud Messaging - 立即收到或长时间延迟收到的消息

    我在大学最后一年的项目中使用谷歌云消息传递 一切正常 但我在使用 GCM 时遇到了一些麻烦 通常 消息要么几乎立即传递 要么有很大的延迟 我读过这篇文章 但我真的认为它不适用于这种情况 GCM 通常会在消息发送后立即传送消息 然而 这并不总
  • 理解 C++11 中的 std::atomic::compare_exchange_weak()

    bool compare exchange weak T expected T val compare exchange weak 是 C 11 中提供的比较交换原语之一 它是weak即使对象的值等于 它也会返回 falseexpected
  • 从包中发布的错误通知无法展开 RemoteViews

    我有个问题 有时我的服务会被这个 logcat 强制关闭 03 26 20 44 44 849 E AndroidRuntime 12080 FATAL EXCEPTION main 03 26 20 44 44 849 E Android
  • 有没有更好的方法来获取每个项目与谓词匹配的子序列?

    假设我有一个 IEnumerable 例如 2 1 42 0 9 6 5 3 8 我需要获得与谓词匹配的项目的 运行 例如 如果我的谓词是 bool isSmallerThanSix int number 我想得到以下输出 2 1 0 5
  • 为什么C语言中可以使用多个分号?

    在 C 中我可以执行以下操作 int main printf HELLO WORLD 它有效 这是为什么 我个人的想法 分号是一个 NO OPERATION 来自维基百科 指示符 拥有一大串分号与拥有一个分号并告诉 C 语句已结束具有相同的
  • 如何强制执行特定的 UserControl 设计

    我正在编写一个基本用户控件 它将由一堆其他用户控件继承 我需要对所有这些后代控件强制执行某种设计 例如 顶部必须有几个按钮以及一个或两个标签 后代用户控件区域的其余部分可以自由放置任何内容 最初 我认为我可以将一个面板放到 Base Use
  • Android - 保留或删除应用程序卸载时创建的文件

    我创建了一个应用程序 用于创建文件并将其存储到 SD 卡 有没有办法将文件夹与应用程序绑定 以便当用户在 Android 设备上运行卸载时删除所有文件 自 2009 年以来似乎有了一些进展 来自文档 http developer andro
  • 创建带有部分的选项卡式侧边栏 WPF

    我正在尝试创建一个带有部分的选项卡式侧边栏 如 WPF 中的以下内容 我考虑过几种方法 但是有没有更简单 更优雅的方法呢 方法一 列表框 Using a ListBox并将 SelectedItem 绑定到右侧内容控件所绑定的值 为了区分标

随机推荐

  • C 中的线程

    我想在C中创建一个线程 以便该线程在两秒后自动调用 我使用Visual Studio和Windows平台进行开发 我该如何开始 您将需要使用操作系统特定的库来执行线程 在 Posix 上 你会想要研究一下pthreads https com
  • 向 Android 应用程序添加屏幕亮度控制

    我希望在应用程序菜单中添加控件来本地调整屏幕亮度 但似乎不知道如何操作 我已经看到了最大化或调暗亮度的示例 但我希望添加控件 以便用户可以控制和设置亮度级别 有谁有任何示例 教程 源代码 或者只是一个可以为我指明正确方向的地方 互联网 ht
  • 通过电话进行 Google 地图/地点 API 搜索

    我们有一个注册页面 用户可以在其中输入他的公司电话号码 我们想从电话号码中找到他的商业信息以进行验证 如何使用 Google 地点 地图 api 来完成此操作 还有更好的选择吗 我有点迷失了 通过谷歌 API 仔细检查后 他们的回复也没有返
  • 带换行符的长字符串

    我见过 C 代码使用 告诉编译器字符串中有换行符并且它应该全部在一行中 C C 有类似的东西吗 就像如果我想放这样的东西 73167176531330624919225119674426574742355349194934 96983520
  • Numpy 中一维数组的滚动窗口?

    有没有办法在 Numpy 中有效地实现一维数组的滚动窗口 例如 我有这个纯 Python 代码片段来计算一维列表的滚动标准差 其中observations是一维值列表 并且n是标准差的窗口长度 stdev for i data in enu
  • 如何在mysql中将日期格式的月份减一? [复制]

    这个问题在这里已经有答案了 假设我有一个 select 语句 SELECT COUNT wedding DATE FORMAT weddate y m d FROM weddingtable 我想让它可以从返回的月份中减去 1 例如 SEL
  • .Net 4 在 StrongNameSignatureVerification 上不断浪费一个 CPU 核心

    我们有一个在 Net 4 Windows 2008 R2 上运行的混合模式汇编应用程序 MFC WinForms 它在一个线程上不断使用 100 的 cpu 使用 ProcessExplorer 我们在繁忙的线程上看到以下堆栈 我们还可以看
  • 需要将mysql数据库中的图像显示到fpdf

    A 将图像作为 blob 保存在 mysql 数据库中 我希望使用 php 将其显示在 fpdf 中 我在执行此操作时遇到问题 因为我对 fpdf 很陌生 我真的需要帮助 谢谢 您将需要 FPDF 的此扩展 http www fpdf or
  • 对 Pandas DataFrame 描述输出进行排序

    我正在尝试对输出进行排序describe 与计数 不太清楚 怎么解决 Tried sort by and loc但它们都没有达到对描述的输出进行排序的目的 需要编辑以下代码行 df groupby Disease Category Appr
  • Rails中的Bootstrap Modal一直显示第一条记录

    当我单击模态中的 视图 时 它继续仅显示第一条记录 即使我单击第二条记录 它仍然显示第一条记录 下面是我如何实现 link to 切换到名为 myModal 的模式框 div class modal fade div class modal
  • 使用 AngularJS 进行 PUT 的 CORS 请求无效

    我的 Spring 应用程序中有一个映射 如下所示 PutMapping path test id public ResponseBody Shop putTest PathVariable id long id RequestBody U
  • 如何从我的应用程序打开 Google Play 商店应用程序以安装 Play 商店中提供的最新版本的应用程序

    我对应用程序的应用程序升级方案有疑问 基本上 我将应用程序版本从应用程序发送到应用程序服务器 然后决定是否显示应用程序升级提醒屏幕 应用程序升级提醒屏幕有 立即更新 或 忽略 2 个选项 要求是 立即更新 应该打开 Play 商店应用程序
  • 如何检查.NET 6运行时是否安装

    作为使用 NET 6 和 WiX 安装程序安装 WPF 应用程序的一部分 我想检查是否安装了 NET 6 运行时 WiX 提供了预定义的属性来检查 NET 框架的属性 但没有提供 NET Core 及其他版本的属性 因此我尝试检查注册表项是
  • 如何在Windows Azure上重写Codeigniter的index.php

    如何在 Windows Azure 和 IIS 上删除 codeigniter 中的 index php 我可以在没有特定模块的情况下重写 Codeigniter 的 index php 的 URL 吗 您可以在 web config 文件
  • 如何获取当前的QApplication?

    我试图使用 pyQt5 获取对当前 QApplication 对象的引用 但找不到该函数 我关于 pyQt get current QApplication 的搜索显示了有关如何创建 QApplication 的结果 所以我的问题是 是否存
  • Git - 分别进行不同的提交。 (使用“git pull”将远程分支合并到您的分支中)

    我的目标是删除 github 上所有提交中的一个文件 因此我执行了后续步骤 我用这个命令过滤了我的分支 git filter branch index filter git rm cached ignore unmatch file nam
  • R:如何根据另一个矩阵提取多维数组值的集合

    假设我有一个 4 维 n x n x n x n 数组 A A 是一个距离矩阵 使得 A i j l k 是从位置 i j 到位置对 l k 的距离 假设我有一个位置类型 T 的 nxn 矩阵 假设类型可以是 0 1 或 2 所以 T i
  • Amazon Redshift 中的递归 CTE

    我们正在尝试移植代码以在 Amazon Redshift 上运行 但 Refshift 不会运行递归 CTE 函数 有好心人知道如何移植这个吗 with tt as select t row number over partition by
  • 在 mac os Sierra (macbook pro 13 2014) 上设置 apache Web 服务器

    http digitalshore io local web development environment apache macos sierra 10 12 http digitalshore io local web developm
  • 在 Android 上使用 ffmpeg 2.1.1 时出现未定义的引用

    我正在按照与以下相同的模式构建 ffmpeg半忍者的构建 https github com halfninja android ffmpeg x264 制作 ffmpeg 的main可通过 JNI 从 Java 获取 我使用以下选项构建了