1. 链接静态库先后顺序不正确,引起的符号定义找不到

libavformat/utils.c:513: error: undefined reference to 'av_parser_close'
libavformat/utils.c:518: error: undefined reference to 'avcodec_parameters_to_context'
libavformat/utils.c:525: error: undefined reference to 'avcodec_parameters_to_context'
libavformat/utils.c:4342: error: undefined reference to 'av_parser_close'
libavformat/utils.c:4345: error: undefined reference to 'av_packet_unref'
libavformat/utils.c:4348: error: undefined reference to 'avcodec_free_context'
libavformat/utils.c:4350: error: undefined reference to 'av_bsf_free'
libavformat/utils.c:4354: error: undefined reference to 'av_bsf_free'
libavformat/utils.c:4355: error: undefined reference to 'av_packet_free'
libavformat/utils.c:4360: error: undefined reference to 'avcodec_parameters_free'
libavformat/utils.c:4365: error: undefined reference to 'avcodec_free_context'
...
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

解决方案:
1.修改静态库的链接顺序。

target_link_libraries(native-libavfilter avformat avcodec avutil swresample swscalelog)

2.忽略静态库的链接顺序。

target_link_libraries(native-lib-Wl,--start-groupavcodec avfilter avformat avutil swresample swscale-Wl,--end-grouplog)

2. 找不到的z库中的符号

libavformat/http.c:1649: error: undefined reference to 'inflateEnd'
libavformat/http.c:680: error: undefined reference to 'inflateEnd'
libavformat/http.c:681: error: undefined reference to 'inflateInit2_'
libavformat/http.c:686: error: undefined reference to 'zlibCompileFlags'
libavformat/http.c:1428: error: undefined reference to 'inflate'
libavformat/id3v2.c:1023: error: undefined reference to 'uncompress'
libavformat/matroskadec.c:1402: error: undefined reference to 'inflateInit_'
libavformat/matroskadec.c:1410: error: undefined reference to 'inflateEnd'
libavformat/matroskadec.c:1417: error: undefined reference to 'inflate'
libavformat/matroskadec.c:1420: error: undefined reference to 'inflateEnd'
libavformat/mov.c:5125: error: undefined reference to 'uncompress'
libavformat/rtmpproto.c:1077: error: undefined reference to 'inflateInit_'
libavformat/rtmpproto.c:1087: error: undefined reference to 'inflate'
libavformat/swfdec.c:364: error: undefined reference to 'uncompress'
libavformat/swfdec.c:153: error: undefined reference to 'inflateInit_'
libavformat/swfdec.c:121: error: undefined reference to 'inflate'
libavcodec/cscd.c:96: error: undefined reference to 'uncompress'
libavcodec/flashsv.c:126: error: undefined reference to 'inflateInit_'
libavcodec/flashsv.c:259: error: undefined reference to 'deflateInit_'
libavcodec/flashsv.c:261: error: undefined reference to 'deflateBound'
libavcodec/flashsv.c:262: error: undefined reference to 'deflateEnd'
libavcodec/flashsv.c:191: error: undefined reference to 'inflateReset'
libavcodec/flashsv.c:210: error: undefined reference to 'inflateSync'
libavcodec/flashsv.c:160: error: undefined reference to 'deflateInit_'
libavcodec/flashsv.c:166: error: undefined reference to 'deflate'
libavcodec/flashsv.c:167: error: undefined reference to 'deflateEnd'
libavcodec/flashsv.c:169: error: undefined reference to 'inflateReset'
libavcodec/lcldec.c:134: error: undefined reference to 'inflateReset'
libavcodec/mscc.c:168: error: undefined reference to 'inflateReset'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

找不到的这些函数名:uncompress、inflateEnd 等都是z库中的函数。
因为 ffmpeg 依赖了z库。编译ffmpeg的时候如果仔细看编译时输出的日志,就可以看到External libraries:
zlib。

[root@iZky8l27ed9oe3Z ffmpeg-4.1.3]# ./build.sh
install prefix            ./android/armeabi-v7a2
source path               .
C compiler                /root/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
C library                 bionic
host C compiler           gcc
host C library            glibc
ARCH                      arm (armv7-a)
big-endian                no
runtime cpu detection     yes
ARMv5TE enabled           yes
ARMv6 enabled             yes
ARMv6T2 enabled           yes
VFP enabled               yes
NEON enabled              yes
THUMB enabled             yes
debug symbols             yes
strip symbols             yes
optimize for size         yes
optimizations             yes
static                    yes
shared                    no
postprocessing support    no
network support           yes
threading support         pthreads
safe bitstream reader     yes
texi2html enabled         no
perl enabled              yes
pod2man enabled           yes
makeinfo enabled          no
makeinfo supports HTML    noExternal libraries:
zlib

z库在NDK目录中:ndk路径\platforms\android-xx\arch-arm\usr\lib\libz.so
解决方案:添加z库的依赖。

target_link_libraries(native-lib
#        -Wl,--start-group
#        avcodec avfilter avformat avutil swresample swscale
#        -Wl,--end-groupavfilter avformat avcodec avutil swresample swscalelogz
)
Fatal signal 11 (SIGSEGV), code 1, fault addr 0x65736164 in tid 21246 (.netease.player)
...
backtrace:#00 pc 65736164  <unknown>#01 pc 000ae7d1  /data/app/com.netease.player-1/lib/arm/libnative-lib.so (_ZN7_JNIEnv12NewGlobalRefEP8_jobject+36)#02 pc 000ae777  /data/app/com.netease.player-1/lib/arm/libnative-lib.so (_ZN14JavaCallHelperC2EP7_JavaVMP7_JNIEnvP8_jobject+46)#03 pc 000aec35  /data/app/com.netease.player-1/lib/arm/libnative-lib.so (Java_com_netease_player_NEPlayer_native_1prepare+76)#04 pc 001327eb  /data/dalvik-cache/arm/data@app@com.netease.player-1@base.apk@classes.dex

3. JNIEnv跨线程使用问题

Fatal signal 11 (SIGSEGV), code 1, fault addr 0x98 in tid 6944 (.netease.player)
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: Honor/SCL-AL00/hnSCL-Q:5.1.1/HonorSCL-AL00/C00B261:user/release-keys
Revision: 0
ABI: arm
pid: 6240, tid: 6944, name: .netease.player  >>> com.netease.player <<<
signal 11 (SIGSEGV), code 0 (SI_USER), fault addr 0x98  r0 00000000  r1 a0131dd0  r2 fffffa94  r3 00000007  r4 b6e08de4  r5 b5259000  r6 00000001  r7 fffffa98  r8 b52454d0  r9 b5256c88  sl 00000000  fp a0131c6c  ip b5256ca0  sp a0131958  lr b5016017  pc b5015ad8  cpsr 800f0030   backtrace:  #00 pc 000afad8  /system/lib/libart.so (_ZN3artL8JniAbortEPKcS1_+47)   #01 pc 000b042f  /system/lib/libart.so (_ZN3art9JniAbortFEPKcS1_z+58)  #02 pc 000b312f  /system/lib/libart.so (_ZN3art11ScopedCheckC2EP7_JNIEnviPKc+334)  #03 pc 000ba801  /system/lib/libart.so (_ZN3art8CheckJNI15CallVoidMethodVEP7_JNIEnvP8_jobjectP10_jmethodIDSt9__va_list+32) #04 pc 000ae943  /data/app/com.netease.player-1/lib/arm/libnative-lib.so (_ZN7_JNIEnv14CallVoidMethodEP8_jobjectP10_jmethodIDz+82) #05 pc 000ae8e9  /data/app/com.netease.player-1/lib/arm/libnative-lib.so (_ZN14JavaCallHelper7onErrorEi+46)    #06 pc 000aea33  /data/app/com.netease.player-1/lib/arm/libnative-lib.so (_ZN8NEFFmpeg8_prepareEv+174) #07 pc 000ae97b  /data/app/com.netease.player-1/lib/arm/libnative-lib.so (_Z12task_preparePv+18)   #08 pc 00013243  /system/lib/libc.so (_ZL15__pthread_startPv+30)   #09 pc 0001125b  /system/lib/libc.so (__start_thread+6)

解决方案:使用 JavaVM 的 AttachCurrentThread函数保证取得当前线程的JNIEnv。

JNIEnv *env;
javaVM->AttachCurrentThread(&env, NULL);
env->CallVoidMethod(instance, jmid_error, errorCode);
javaVM->DetachCurrentThread();

ffmpeg项目编译出错问题解决方案.相关推荐

  1. .NET项目报受源代码管理,向源代码管理注册此项目时出错的解决方案

    拿到了别人写的一个项目使用VS打开时报错:受源代码管理,向源代码管理注册此项目时出错.导致项目在VS中无法加载,解决这个错误只需要找到该项目的csproj文件并打开进行一些修改即可. 具体方法: 找到 ...

  2. PhoneGap在Microsoft Visual Studio Express For Windows Phone上编译出错的解决方案

    1.错误现象: 为何我用 这个phonegap 出错呢? 环境: visual studio 2010 express for windwos phone,  sdk 7.1 phonegap 1.3 ...

  3. ffmpeg本地编译没有ffplay解决方案

    在本地编译ffmpeg的时候编译没有ffplay,是因为缺少sdl库 只需要安装对应的库就行了 两个库之间差别还是很大的,至于怎样选择就看个人需要了,最好是两个都安装让编译的时候脚本自动判断选择吧 s ...

  4. Netgen编译出错的解决方案

    1.fatal error C1083: 无法打开包括文件:"pthread.h": No such file or directory c/c++ general 附加包含路径添 ...

  5. vue项目编译出错eslint

    1.如果安装了 eslint :它的语法很严格,当多打空格啥的都会报错, 如: Expected space or tab after '//' in comment 故:关闭 方式如下 修改buil ...

  6. Android项目出现main.xml编译出错和 出现main.out.xml无法编译的解决办法

    由于Eclipse的原因 当run时处于xml文件的情况下 会出现这个问题 解决办法是: 1首先把自动生成的空文件main.out.xml删除 然后项目会出错 这时候选择Project--Clean ...

  7. Visual Studio 2005 提示“试图运行项目时出错:无法启动调试。绑定句柄无效”~[解决方案]...

    如果VS提示"试图运行项目时出错:无法启动调试.绑定句柄无效"时, 解决方案有两种: 一.将项目属性里调试 --〉取消 启用 Visual Studio 宿主进程 二.将Termi ...

  8. 使用Cmake生成跨平台项目编译解决方案

    项目最近有需求在windows下面运行,我花了几周时间将linux的服务器移植到windows下面,目前已经能够正常运行服务器,目前又有了新需求,两边的代码结构和组织是分开的,因此为了两边能够同步维护 ...

  9. go项目编译运行期间遇到的部分问题与解决方案【图文式小白教程】

    go项目编译运行期间遇到的部分问题与解决方案[图文式小白教程] 文章目录 go: github.com/axgle/mahonia@v0.0.0-20180208002826-3358181d7394 ...

最新文章

  1. 关于timewait状态
  2. 使用clear fix清除浮动
  3. ImageLazyLoad-图片随着滚动而进行加载
  4. 数字信号处理学习笔记(二)|快速傅里叶变换
  5. XML Tree(树形结构)
  6. 腾讯 开源软件列表-开源中国社区
  7. 常用公有云接入——亚马逊
  8. python语言的注释语句引导符_Python 为什么用 # 号作注释符?
  9. 微型计算机在工作过程中突然遇到电源中断,微型计算机在工作过程中突然遇到电源中断,则计算机 中的信息将全部丢失,再次接通电源后也不能恢复数据。...
  10. 对象流java_Java中的对象流总结(必看篇)
  11. 大O,您如何计算/近似?
  12. 税控服务器组件接口v2.1.1.1,税控开票服务器组件接口规范标准版V1.9(2016.04.04).pdf...
  13. HTML 禁用Select下拉框的上下左右键盘按键默认事件
  14. 云主机 环境搭配 交接文档
  15. 100大产业链全景图(2020版)及智能制造50大产业链
  16. 有监督学习(supervised learning))与无监督学习(unsupervised learning)之间有何区别?
  17. java同步锁有哪几种_Java实现锁的几种方式
  18. 用大白话聊聊JavaSE -- 自定义注解入门
  19. java base64转图片
  20. shell小知识总结

热门文章

  1. 搭配emuc-b202 can卡通讯时,时断时续
  2. deepin php7,deepin安装php7
  3. Bootstrap4从入门到精通视频教程
  4. 8000 字深度长文!B端数据可视化设计指南(信息图表篇)
  5. 基于VUE的SVG动画处理(一)
  6. 迭代器 iter()
  7. 字符集和字符编码(Charset Encoding)
  8. 根据点云及其对应的四元数与GPS计算出其相对坐标系的经纬坐标(matlab)
  9. android apk下载完成后调用安装
  10. STM32F4之ADC介绍