AS使用NDK Cmake方式依賴第三方庫

AS使用NDK Cmake方式依賴第三方庫注意事項

AS2.2之後支持Cmake了,之前的 Android.mk的方式能夠告別了, 官方教程

CMakeLists.txt文件的書寫

  1. 引入第三方庫使用add_library()須要指定是SHARED->.so or STATIC->.a,和IMPORTED,而且每次只能寫一個庫,若是引入2個第三方庫就要寫2個add_library()html

    add_library(
            nn
            SHARED
            IMPORTED
            )
  2. include_directories()用於指定頭文件的,通常是在include文件夾下,能夠用於第三方庫或者本身源文件的頭文件.android

    include_directories(src/main/jni/armeabi-v7a/include/)
  3. 在引入第三方庫時還須要指定set_target_properties()庫的路徑,也就是.soor.a庫文件的路徑,這裏要注意的是爲了區分CPU架構,不一樣版本的.so文件放的路徑也不同,因此要用${ANDROID_ABI}來指定路徑,這也讓咱們必須把對應CPU架構的.so文件放在指定CPU架構目錄下(這裏只有armeabi-v7a):c++

    ![cpu架構.png](http://upload-images.jianshu.io/upload_images/1638086-d0faebf2a7f41dee.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    set_target_properties(nn
                  PROPERTIES IMPORTED_LOCATION
                  ${CMAKE_SOURCE_DIR}/src/main/jni/${ANDROID_ABI}/lib/libnn.so
                  )

    若是直接寫相對路徑可能會出現 Error:error: '../../../../src/main/libs/libjsoncpp.a', needed by '../obj/armeabi/libnative-lib.so', missing and no known rule to make itjson

  4. 若是要依賴NDK中的庫架構

    find_library( jnigraphics-lib
    jnigraphics )
    target_link_libraries( StackBlur
    ${log-lib}
    ${m-lib}
    ${jnigraphics-lib} )

附上CMakeLists.txt所有內容:gradle

cmake_minimum_required(VERSION 3.4.1)

add_library( native-lib
             SHARED
             src/main/cpp/native-lib.cpp )

# 添加實驗室nn.so庫
add_library(
            nn
            SHARED
            IMPORTED
            )

set_target_properties(nn
                      PROPERTIES IMPORTED_LOCATION
                      ${CMAKE_SOURCE_DIR}/src/main/jni/${ANDROID_ABI}/lib/libnn.so
                      )
# 指定頭文件路徑
include_directories(src/main/jni/armeabi-v7a/include/)

find_library( log-lib
              log )

target_link_libraries( native-lib nn ${log-lib} )

Gradle的書寫

AS建立時就是使用的cmake,因此Gradle基本都沒啥問題,須要添加的可能有一下幾點ui

  1. 指定須要編譯的abi版本,在android{}->defaultCondfig{}c++11

    ndk {
        abiFilter 'armeabi-v7a'
    }
  2. 指定c++版本和異常處理code

    externalNativeBuild {
        cmake {
            cppFlags "-std=c++11 -frtti-fexceptions"
        }
    }
相關文章
相關標籤/搜索