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)






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章