AS使用NDK Cmake方式依赖第三方库

前端之家收集整理的这篇文章主要介绍了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()

    1. add_library(
    2. nn
    3. SHARED
    4. IMPORTED
    5. )
  2. include_directories()用于指定头文件的,一般是在include文件夹下,可以用于第三方库或者自己源文件的头文件.

    1. include_directories(src/main/jni/armeabi-v7a/include/)
  3. 在引入第三方库时还需要指定set_target_properties()库的路径,也就是.soor.a文件的路径,这里要注意的是为了区分cpu架构,不同版本的.so文件放的路径也不一样,所以要用${ANDROID_ABI}来指定路径,这也让我们必须把对应cpu架构的.so文件放在指定cpu架构目录下(这里只有armeabi-v7a):

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

    如果直接写相对路径可能会出现 Error:error: '../../../../src/main/libs/libjsoncpp.a',needed by '../obj/armeabi/libnative-lib.so',missing and no known rule to make it

  4. 如果要依赖NDK中的库

    1. find_library( jnigraphics-lib
    2. jnigraphics )
    3. target_link_libraries( StackBlur
    4. ${log-lib}
    5. ${m-lib}
    6. ${jnigraphics-lib} )

附上CMakeLists.txt全部内容

  1. cmake_minimum_required(VERSION 3.4.1)
  2.  
  3. add_library( native-lib
  4. SHARED
  5. src/main/cpp/native-lib.cpp )
  6.  
  7. # 添加实验室nn.so库
  8. add_library(
  9. nn
  10. SHARED
  11. IMPORTED
  12. )
  13.  
  14. set_target_properties(nn
  15. PROPERTIES IMPORTED_LOCATION
  16. ${CMAKE_SOURCE_DIR}/src/main/jni/${ANDROID_ABI}/lib/libnn.so
  17. )
  18. # 指定头文件路径
  19. include_directories(src/main/jni/armeabi-v7a/include/)
  20.  
  21. find_library( log-lib
  22. log )
  23.  
  24. target_link_libraries( native-lib nn ${log-lib} )

Gradle的书写

AS创建时就是使用的cmake,所以Gradle基本都没啥问题,需要添加的可能有一下几点

  1. 指定需要编译的abi版本,在android{}->defaultCondfig{}

    1. ndk {
    2. abiFilter 'armeabi-v7a'
    3. }
  2. 指定c++版本和异常处理

    1. externalNativeBuild {
    2. cmake {
    3. cppFlags "-std=c++11 -frtti-fexceptions"
    4. }
    5. }

猜你在找的设计模式相关文章