因为我们只编译了 arm 版本的 so,所以需要把 so 拷到 armeabi-v7a 目录下,完整路径
├── build.gradle
├── libs
│ ├── armeabi-v7a
│ │ ├── libavcodec-57.so
│ │ ├── libavfilter-6.so
│ │ ├── libavformat-57.so
│ │ ├── libavutil-55.so
│ │ ├── libswresample-2.so
│ │ └── libswscale-4.so
│ └── include
│ ├── libavcodec
│ ├── libavfilter
│ ├── libavformat
│ ├── libavutil
│ ├── libswresample
│ └── libswscale
├── proguard-rules.pro
└── src
└── main
├── AndroidManifest.xml
├── cpp
├── java
└── res
指定JniLibs库的地址,这个是在NDK编译时能够找到相应的库路径或头文件的路径
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
指定abifilter:指定当前软件支持的CPU
android {
...
defaultConfig {
...
ndk {
abiFilters
'armeabi-v7a'
}
}
}
编写Cmake脚本
cmake_minimum_required(VERSION 3.4.1)
add_library( # 设置库的名字
native-lib
# 设置为共享库
SHARED
# 编译下面的问生成的库文件时上面的名字
src/main/cpp/native-lib.cpp )
add_library( avcodec-57 #这是我们编译的库文件
SHARED #共享库
IMPORTED )
set_target_properties( avcodec-57 #编译的库文件
PROPERTIES IMPORTED_LOCATION #定义导入库的文章
../../../../libs/armeabi-v7a/libavcodec-57.so )
add_library( avfilter-6
SHARED
IMPORTED )
set_target_properties( avfilter-6
PROPERTIES IMPORTED_LOCATION
../../../../libs/armeabi-v7a/libavfilter-6.so )
add_library( avformat-57
SHARED
IMPORTED )
set_target_properties( avformat-57
PROPERTIES IMPORTED_LOCATION
../../../../libs/armeabi-v7a/libavformat-57.so )
add_library( avutil-55
SHARED
IMPORTED )
set_target_properties( avutil-55
PROPERTIES IMPORTED_LOCATION
../../../../libs/armeabi-v7a/libavutil-55.so )
add_library( swresample-2
SHARED
IMPORTED )
set_target_properties( swresample-2
PROPERTIES IMPORTED_LOCATION
../../../../libs/armeabi-v7a/libswresample-2.so )
add_library( swscale-4
SHARED
IMPORTED )
set_target_properties( swscale-4
PROPERTIES IMPORTED_LOCATION
../../../../libs/armeabi-v7a/libswscale-4.so )
#指定头文件的目录地址
include_directories( libs/include )
#日志文件文件库的这种
find_library(
log-lib
log )
#对连接库的指定
target_link_libraries( # Specifies the target library.
native-lib
avcodec-57
avfilter-6
avformat-57
avutil-55
swresample-2
swscale-4
# Links the target library to the log library
# included in the NDK.
${log-lib} )
在java文件中引用下列相应的库文件:下列的库要注意相应的引入顺序,如果顺序不对可能有好多异常出现(后面使用单个so是就不会出现)
static {
System.loadLibrary("native-lib");
System.loadLibrary("avcodec-57");
System.loadLibrary("avfilter-6");
System.loadLibrary("avformat-57");
System.loadLibrary("avutil-55");
System.loadLibrary("swresample-2");
System.loadLibrary("swscale-4");
}
native-lib.cpp中输入代码
#include <jni.h>
#include <string>
extern "C"{
#include <libavcodec/avcodec.h>>
}
extern "C"
jstring
Java_com_example_testffmpeg_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
// return env->NewStringUTF(hello.c_str());
return env->NewStringUTF(av_version_info());
}