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