美文网首页Android TipsAndroid StudioJNI&NDK
【NDK】Android Studio2.2+使用CMake依赖

【NDK】Android Studio2.2+使用CMake依赖

作者: ldlywt | 来源:发表于2017-04-03 10:00 被阅读6766次

    Android Studio2.2出来后,支持CMake构建工具,我们做NDK开发会容易很多:

    • 支持一键生成native方法
    • 支持在C语言中有代码提示
    • 如果在C中写错了会有错误提示
    • 支持在C中打断点进行debug
      ...

    官方教程:

    https://developer.android.google.cn/studio/projects/add-native-code.html?hl=zh-cn#new-project

    但是如果我在想在CMake中依赖多个第三方库,我在网上找了很久都没找到怎么使用,怎么弄都同步不过去,折腾了很久终于弄好了,记录下。

    依赖的第三方库

    假如我要依赖的第三方库是:libcurl.a和jsoncpp.a。
    项目工程结构如下:

    工程结构.png

    Error

    • missing and no known rule to make it
      我以前怎么试都编译不过去,最后发现依赖的第三方库要放到JniLibs的不同CPU架构下,不然会爆出错误:

    Error:error: '../../../../src/main/libs/libjsoncpp.a', needed by '../obj/armeabi/libnative-lib.so', missing and no known rule to make it

    • undefined reference to AndroidBitmap_getInfo


      Paste_Image.png

      函数未定义,这个错误类似于在c语言中使用android_log一样,如果你在C语言中使用了AndroidBitmap,也要依赖Bitmap库:jnigraphics。需要从NDK中找到这个库并使用依赖log库的方法将其添加。
      解决办法如下:

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

    CMake.txt

    add_library( ): .c或者.cpp文件要假如里面;
    include_directories( ) :第三库使用到的头文件;

    依赖第三方库

    每次只能写一个:

    add_library(curl STATIC IMPORTED)
    set_target_properties(curl
      PROPERTIES IMPORTED_LOCATION
      ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libcurl.a)
    

    STATIC:表示静态的.a的库。
    SHARED:表示.so的库。
    ${CMAKE_SOURCE_DIR}:表示CMake.txt的当前文件夹路径。
    ${ANDROID_ABI}:编译时会自动根据CPU架构去选择相应的库。

    依赖NDK中的库

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

    最后附上Cmake.txt:

    cmake_minimum_required(VERSION 3.4.1)
    
    add_library(native-lib
                 SHARED
                 src/main/cpp/native-lib.cpp
                 src/main/cpp/JniUtils.cpp
                 src/main/cpp/web_task.cpp )
    
     include_directories( src/main/cpp/include/jsoncpp
                          src/main/cpp/include/curl
                         )
    
    add_library(curl STATIC IMPORTED)
    set_target_properties(curl
      PROPERTIES IMPORTED_LOCATION
      ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libcurl.a)
    
    add_library(jsoncpp STATIC IMPORTED)
    set_target_properties(jsoncpp
      PROPERTIES IMPORTED_LOCATION
      ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libjsoncpp.a)
    
    # 不能向下面格式写,会出现 Error:error: '../../../../src/main/libs/libjsoncpp.a', needed by '../obj/armeabi/libnative-lib.so', missing and no known rule to make it
    
    # add_library(curl STATIC IMPORTED)
    # set_target_properties(curl
    #   PROPERTIES IMPORTED_LOCATION
    #   ${CMAKE_SOURCE_DIR}/src/main/libs/libcurl.a)
    
    # add_library(jsoncpp STATIC IMPORTED)
    # set_target_properties(jsoncpp
    #   PROPERTIES IMPORTED_LOCATION
    #   ${CMAKE_SOURCE_DIR}/src/main/libs/libjsoncpp.a)
    
    find_library( # Sets the name of the path variable.
                  log-lib
                  log )
    
    target_link_libraries( # Specifies the target library.
                           native-lib
    
                           jsoncpp
                           curl
                           ${log-lib} )
    
    

    相关文章

      网友评论

      • 590572f5ec89:正好需要
      • 贝克街的猫大哥呀:3Q
        我也被这事困扰了好久,能不能和你再聊聊这事呢?
        ldlywt:@过期的薯条 普通的底层不高,更硬件打交道的做到后面更吃香,大部分时间在写C/C++
        过期的薯条:@假装是程序猿丶 做jni工资高不
        ldlywt:我从上家公司离职后,不做jni了,JNI做的太累了

      本文标题:【NDK】Android Studio2.2+使用CMake依赖

      本文链接:https://www.haomeiwen.com/subject/myvnottx.html