美文网首页
NDK-FFmpeg 开发常见错误

NDK-FFmpeg 开发常见错误

作者: 杨0612 | 来源:发表于2020-01-09 13:02 被阅读0次

1.To make sure the C++ compiler uses unmodified names when calling functions in your C code,list your C fnctions in you C++ code using extern "C"

以下是log输出的错误信息:

 java.lang.UnsatisfiedLinkError: No implementation found for void com.yang.ffmpegmediaplayer.manager.FFmpegMediaPlayer.nativePrepare(com.yang.ffmpegmediaplayer.manager.FFmpegMediaPlayer$PlayListener) (tried Java_com_yang_ffmpegmediaplayer_manager_FFmpegMediaPlayer_nativePrepare and Java_com_yang_ffmpegmediaplayer_manager_FFmpegMediaPlayer_nativePrepare__Lcom_yang_ffmpegmediaplayer_manager_FFmpegMediaPlayer_00024PlayListener_2)
        at com.yang.ffmpegmediaplayer.manager.FFmpegMediaPlayer.nativePrepare(Native Method)
        at com.yang.ffmpegmediaplayer.manager.FFmpegMediaPlayer.prepare(FFmpegMediaPlayer.kt:37)

错误意思:如果你要在C++代码调用C的函数,请使用extern "C"。因为FFmpeg是C语言的代码,而cpp文件是C++的,所以在运行时会出现找不到对应native方法。
extern “C”的主要作用就是为了能够让C++代码调用的函数。加上extern “C”后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。
解决办法:在函数开头加入extern "C"

extern "C" JNIEXPORT void JNICALL
Java_com_yang_ffmpegmediaplayer_manager_FFmpegMediaPlayer_nativePrepare(JNIEnv *env,jobject object){
    LOGD("nativePrepare");
};

2.找不到FFmpeg方法

* What went wrong:
Execution failed for task ':app:externalNativeBuildDebug'.
> Build command failed.
  Error while executing process C:\software\Android\sdk\cmake\3.10.2.4988404\bin\ninja.exe with arguments {-C D:\private\AndroidProject\FFmpegMediaPlayer\app\.cxx\cmake\debug\armeabi-v7a ffmpegmediaplayer}
  ninja: Entering directory `D:\private\AndroidProject\FFmpegMediaPlayer\app\.cxx\cmake\debug\armeabi-v7a'
  [1/2] Building CXX object CMakeFiles/ffmpegmediaplayer.dir/native-lib.cpp.o
  clang++: warning: argument unused during compilation: '-LD:/private/AndroidProject/FFmpegMediaPlayer/app/src/main/cpp/../../../libs/armeabi-v7a' [-Wunused-command-line-argument]
  [2/2] Linking CXX shared library D:\private\AndroidProject\FFmpegMediaPlayer\app\build\intermediates\cmake\debug\obj\armeabi-v7a\libffmpegmediaplayer.so
  FAILED: D:/private/AndroidProject/FFmpegMediaPlayer/app/build/intermediates/cmake/debug/obj/armeabi-v7a/libffmpegmediaplayer.so 
  cmd.exe /C "cd . && C:\software\Android\sdk\ndk\20.1.5948944\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=armv7-none-linux-androideabi23 --gcc-toolchain=C:/software/Android/sdk/ndk/20.1.5948944/toolchains/llvm/prebuilt/windows-x86_64 --sysroot=C:/software/Android/sdk/ndk/20.1.5948944/toolchains/llvm/prebuilt/windows-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -fno-addrsig -march=armv7-a -mthumb -Wa,--noexecstack -Wformat -Werror=format-security   -LD:/private/AndroidProject/FFmpegMediaPlayer/app/src/main/cpp/../../../libs/armeabi-v7a -O0 -fno-limit-debug-info  -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--exclude-libs,libunwind.a -Wl,--no-undefined -Qunused-arguments -Wl,-z,noexecstack -shared -Wl,-soname,libffmpegmediaplayer.so -o D:\private\AndroidProject\FFmpegMediaPlayer\app\build\intermediates\cmake\debug\obj\armeabi-v7a\libffmpegmediaplayer.so CMakeFiles/ffmpegmediaplayer.dir/native-lib.cpp.o  -Wl,--start-group -lavfilter -lavformat -lavcodec -lavutil -lswresample -lswscale -Wl,--end-group -lz -landroid -llog -latomic -lm && cd ."
  D:/private/AndroidProject/FFmpegMediaPlayer/app/src/main/cpp/native-lib.cpp:24: error: undefined reference to 'av_version_info()'
  clang++: error: linker command failed with exit code 1 (use -v to see invocation)
  ninja: build stopped: subcommand failed.

解决办法:
因为FFmpeg是C语言代码,而cpp文件是C++的,所以在导入FFmpeg相应头文件的时候,要将语句包括在extern "C"{}中

extern "C" {
#include <libavutil/avutil.h>
}

3.This file is not part of the project.Please include it in the appropriate build file(build.gradle,CMakeLists.txt or Android.mk etc) and sync the project

源文件没有配置都CMakeLists.txt 文件中
解决办法:

add_library(
        ffmpegmediaplayer
        SHARED
        native-lib.cpp
        player.cpp)

player.cpp,为出现错误提示的文件,将它配置到CMakeLists当中即可。

相关文章

  • NDK-FFmpeg 开发常见错误

    1.To make sure the C++ compiler uses unmodified names whe...

  • 开发常见错误

    01./Applications/Xcode.app/Contents/Developer/Toolchains/...

  • 十四、Error处理、泛型

    错误处理(异常处理) 错误类型 开发过程中常见的错误: 语法错误(编译报错) 逻辑错误 (偏离开发人员本意) 运行...

  • iOS开发常见错误

    一般是框架导入错误. eg: 当前创建的类继承自 NSObject, 自动导入Foundation框架,而.m文件...

  • Android开发常见错误

      我们在平时Android开发的过程中,肯定会遇到各种各样的编译问题,有时候确实是我们的代码有问题;但有时候却是...

  • SpringMVC开发常见错误

    一、出现如下图的错误 原因可能如下: 1、下图方框中没配置好 2. 有可能是jdk太低了,使用jdk7或者更高版本...

  • 常见iOS开发错误

    原文这个 内存泄漏 野指针 重复代码(包括功能类似) 没必要的子类 编码风格不一致 状态太多 架构设计不合理 Co...

  • cordvoa 开发常见错误集锦

    1. 有的时候我们在一个目录下面执行cordova build命令,会报以下的错误 A: 此类问题一般都是当前项目...

  • Android 开发常见错误集锦

    一、Android Web View 错误: 错误信息:No DRP key due to exception:j...

  • iOS开发中常见错误

    iOS开发中遇到的常见错误,未完善后期修改整理完善! 苹果官方Xcode帮助IOS Xcode调试常用命令和断点整...

网友评论

      本文标题:NDK-FFmpeg 开发常见错误

      本文链接:https://www.haomeiwen.com/subject/enlyactx.html