热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

c/c++开发分享使用ffmpeg2.1.1forAndroid时未定义的引用

我正在按照与halfninja构建相同的模式构建ffmpeg:通过JNI从Java获取ffmpeg的main。我使用以下选项构建了ffmpeg:.configure--prefix

我正在按照与halfninja构建相同的模式构建 ffmpeg:通过JNI从Java获取ffmpeg的main 。 我使用以下选项构建了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" 

$PREFIXTOOLCHAIN ,…从我的NDK设置为相应的文件夹。 $ADDI_CFLAGS设置为-marm$ADDI_LDFLAGS$ADDITIONAL_CONFIGURE_FLAGS $ADDI_LDFLAGS设置。 生成的静态库:

  $ 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二进制等价物构建为静态库。 我在我的jni文件夹中复制了(并且现在没有更改单个字符) ffmpeg.cffmpeg.hcmdutils.ccmdutils.hffmpeg_opt.cffmpeg_filter.c 。 我在这个文件夹中也有两个直接与JNI相关的文件(从halfninja的build中复制,我刚刚更改了包名)。 这是相关的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:错误:对'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:错误:对'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到'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 '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 '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到'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

    检查所有名称是否一致。

    需要了解更多c/c++开发分享使用ffmpeg 2.1.1 for Android时未定义的引用,也可以关注C/ C++技术分享栏目—编程笔记

      以上就是c/c++开发分享使用ffmpeg 2.1.1 for Android时未定义的引用相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(编程笔记)。


      推荐阅读
      • Jupyter Notebook多语言环境搭建指南
        本文详细介绍了如何在Linux环境下为Jupyter Notebook配置Python、Python3、R及Go四种编程语言的环境,包括必要的软件安装和配置步骤。 ... [详细]
      • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
      • 本文详细介绍了 `org.apache.tinkerpop.gremlin.structure.VertexProperty` 类中的 `key()` 方法,并提供了多个实际应用的代码示例。通过这些示例,读者可以更好地理解该方法在图数据库操作中的具体用途。 ... [详细]
      • Beetl是一款先进的Java模板引擎,以其丰富的功能、直观的语法、卓越的性能和易于维护的特点著称。它不仅适用于高响应需求的大型网站,也适合功能复杂的CMS管理系统,提供了一种全新的模板开发体验。 ... [详细]
      • 本文通过C++语言实现了一个递归算法,用于解析并计算数学表达式的值。该算法能够处理加法、减法、乘法和除法操作。 ... [详细]
      • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
      • 本问题涉及在给定的无向图中寻找一个至少包含三个节点的环,该环上的节点不重复,并且环上所有边的长度之和最小。目标是找到并输出这个最小环的具体方案。 ... [详细]
      • 洛谷 P4009 汽车加油行驶问题 解析
        探讨了经典算法题目——汽车加油行驶问题,通过网络流和费用流的视角,深入解析了该问题的解决方案。本文将详细阐述如何利用最短路径算法解决这一问题,并提供详细的代码实现。 ... [详细]
      • spring boot使用jetty无法启动 ... [详细]
      • 高级缩放示例.就像谷歌地图一样.它仅缩放图块,但不缩放整个图像.因此,缩放的瓷砖占据了恒定的记忆,并且不会为大型缩放图像调整大小的图像.对于简化的缩放示例lookhere.在Win ... [详细]
      • 小编给大家分享一下Vue3中如何提高开发效率,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获, ... [详细]
      • 本文详细介绍了如何在 Vue CLI 3.0 和 2.0 中配置 proxy 来解决开发环境下的跨域问题,包括具体的配置项和使用场景。 ... [详细]
      • Logging all MySQL queries into the Slow Log
        MySQLoptionallylogsslowqueriesintotheSlowQueryLog–orjustSlowLog,asfriendscallit.However,Thereareseveralreasonstologallqueries.Thislistisnotexhaustive:Belowyoucanfindthevariablestochange,astheyshouldbewritteninth ... [详细]
      • 在Ubuntu 18.04上使用Nginx搭建RTMP流媒体服务器
        本文详细介绍了如何在Ubuntu 18.04上使用Nginx和nginx-rtmp-module模块搭建RTMP流媒体服务器,包括环境搭建、配置文件修改和推流拉流操作。适用于需要搭建流媒体服务器的技术人员。 ... [详细]
      • 在Java开发中,如何利用ProcessBuilder类调用外部程序是一个常见的需求。本文将详细介绍ProcessBuilder类的使用方法,并提供示例代码帮助你更好地理解和应用。 ... [详细]
      author-avatar
      直由飞翔_447
      这个家伙很懒,什么也没留下!
      PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
      Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有