AndroidStudio2.2.3版本使用CMake编译NDK工程(ffmpeg)

Ecilpse也用了好几年了,最近拿到一台7.0的Nexus5x,结果用Ecilpse只能识别到设备,而不能识别其Android版本,也无法看到其log输出,将SDK版本升级到了25也还是如此。于是兴起了再次使用AndroidStudio的念头,为什么说是“再”,因为早在AndroidStudio版本为0.9的时候下载过来用,但是实在是太卡了,我这里Gradle一同步就可以导致笔记本直接死机……于是不得不放弃。

现在重新下载了最新的2.2.3版本,安装,导入之前Ecilpse里的项目,修复一些兼容性的问题,发现新版的AndroidStudio虽然在gradle同步的时候还是卡,但已经好了很多,可以接受了。usb连接nexus5x也可以识别设备版本号,可以真机debug了。

之前用Ecilpse的时候都是用Cygwin来编译JNI的so库,AndroidStudio2.2版本引入了CMake来编译NDK的工程,找了一些网上的资料,主要是参考google在github上的最新samples:https://github.com/googlesamples/android-ndk ,将自己之前的ndk-build的方式改成了CMake编译。

我的JNI层主要是一些视频编解码的代码,移植的就是ffmpeg库。ffmpeg库的编译这里就不多讲了,网上很多资料,这里是把ffmpeg按照自己的config编译成了几个静态库:libavformat, libavcodec, libavutil, libswscale, libpostproc, libx264。

在CMakeLists.txt中导入静态库:

# 设置ffmpeg的路径,CMAKE_CURRENT_SOURCE_DIR为当前的路径
set(FFMPEG_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../ffmpeg)

# libavcodec
add_library( avcodec
             STATIC
             IMPORTED )
set_target_properties(  avcodec
                        PROPERTIES
                        IMPORTED_LOCATION
                        ${FFMPEG_DIR}/lib/libavcodec.a)

# libavformat
add_library( avformat
             STATIC
             IMPORTED )
set_target_properties(  avformat
                        PROPERTIES
                        IMPORTED_LOCATION
                        ${FFMPEG_DIR}/lib/libavformat.a)

# libavutil
add_library( avutil
             STATIC
             IMPORTED )
set_target_properties(  avutil
                        PROPERTIES
                        IMPORTED_LOCATION
                        ${FFMPEG_DIR}/lib/libavutil.a)

#libswscale
add_library( swscale
             STATIC
             IMPORTED )
set_target_properties(  swscale
                        PROPERTIES
                        IMPORTED_LOCATION
                        ${FFMPEG_DIR}/lib/libswscale.a)

#libpostproc
add_library( postproc
             STATIC
             IMPORTED )
set_target_properties(  postproc
                        PROPERTIES
                        IMPORTED_LOCATION
                        ${FFMPEG_DIR}/lib/libpostproc.a)

#libx264
add_library( x264
             STATIC
             IMPORTED )
set_target_properties(  x264
                        PROPERTIES
                        IMPORTED_LOCATION
                        ${FFMPEG_DIR}/lib/libx264.a)


获取路径下的源文件:

# 获取目录下的所有src文件
set(SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR})
aux_source_directory(${SRC_DIR} src_files)
MESSAGE("Source file:${src_files} to build now...")

设置一些编译选项:

# 设置编译选项
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")

# -s选项为strip,不strip生成的库文件会很大
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -s")
生成的动态库:

# 将src文件编译成动态库
add_library(
            native-lib
            SHARED
            ${src_files}
)
# 添加头文件目录
target_include_directories( native-lib PRIVATE
                            ${SRC_DIR}
                           )
最终link的时候会用上的库:

target_link_libraries( # Specifies the target library.
                       native-lib

                       # Links the target library to the log library
                       # included in the NDK.
                       # 1.库 z 避免undefined reference to 'uncompress'错误
                       # 2.库 jnigraphics 为在JNI使用bitmap
                       # 3.库 m 是一些数学计算用到
                       ${log-lib}
                       z
                       m
                       jnigraphics
                       avformat
                       avcodec
                       avutil
                       swscale
                       postproc
                       x264)






你可能感兴趣的:(AndroidStudio2.2.3版本使用CMake编译NDK工程(ffmpeg))