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)