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)