创建C++ Android项目
- 勾选 c++ support
- 使用cmake
3. 异常信息等支出
添加NDK路径
Project Structure
安装Cmake工具
Android SDK中安装CMake和LLDB
添加module(library)
Module添加C++支持
1、移动项目中cmakelist.txt到Module根目录下
2、剪切 build.gradle 中
externalNativeBuild {
cmake {
cppFlags "-frtti -fexceptions"
}
}
到 module 的 build.gradle 中
3、剪切 build.gradle 中
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
到 module 的 build.gradle 中
4、移动项目中cpp文件夹到module中
5.添加ffmpeg动态库
1、module cpp文件夹中创建include文件夹,并添加ffmpeg中include里 面的所有文件
2、module main文件夹中创建jniLibs,复制arm和x86的.so库到jniLibs中
3、在build.gradle中设置编译cpu架构和动态库(.so)路径
externalNativeBuild {
cmake {
cppFlags "-frtti -fexceptions"
abiFilters 'armeabi', "x86"
}
}
sourceSets {
main {
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
cmakelist中配置ffmpeg
1、导入include路径 include_directories(src/main/cpp/include)
2、设置动态库路径(如:libavcodec-57.so) set_target_properties( avcodec-57 PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libavcodec-57.so)
3、添加动态库 add_library( avcodec-57 SHARED IMPORTED)
4、链接动态库 avcodec-57 avdevice-57 avfilter-6 avformat-57 avutil-55 swresample-2 swscale-4 postproc-54
Java中加载动态库
static {
System.loadLibrary("avutil-55");
System.loadLibrary("swresample-2");
System.loadLibrary("avcodec-57");
System.loadLibrary("avformat-57");
System.loadLibrary("swscale-4");
System.loadLibrary("postproc-54");
System.loadLibrary("avfilter-6");
System.loadLibrary("avdevice-57");
}
测试ffmpeg
#define LOGI(FORMAT,...) __android_log_print(ANDROID_LOG_INFO,"ywl5320",FORMAT,##__VA_ARGS__);
av_register_all();
AVCodec *c_temp = av_codec_next(NULL);
while (c_temp != NULL)
{
switch (c_temp->type)
{
case AVMEDIA_TYPE_VIDEO:
LOGI("[Video]:%s", c_temp->name);
break;
case AVMEDIA_TYPE_AUDIO:
LOGI("[Audio]:%s", c_temp->name);
break;
default:
LOGI("[Other]:%s", c_temp->name);
break;
}
c_temp = c_temp->next;
}