NDK-FFmpeg 开发常见错误

2020-01-09  本文已影响0人  杨0612

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当中即可。

上一篇 下一篇

猜你喜欢

热点阅读