美文网首页实用后端砖头Android
Android Studio 导入第三方 C/C++库

Android Studio 导入第三方 C/C++库

作者: 安然罓安好 | 来源:发表于2022-07-15 16:59 被阅读0次

    前提说明:

    本文以导入 腾讯 IM SDK C++ 为例

    库地址:

    IM SDK C++下载链接:https://github.com/TencentCloud/TIMSDK/tree/master/Android/IMSDK

    image.png

    一:C/C++库导入

    二:CMakeLists.txt 文件配置

    1. 设置目标库

    # 添加项目
    project("imdemo")
    
    # 添加目标库
    add_library(
            imdemo #设置库名称
    
            SHARED #设置库为共享库
    
            native-lib.cpp # 添加.cpp源文件
    )
    

    注:imdemo 要与 System.loadLibrary("imdemo"); 名称一致

    2. 添加库头文件

    # 添加依赖头文件路径:直接填 文件夹名称就行
    include_directories( include )
    

    3. 添加第三方库

    #导入第三方动态库
    add_library(imsdk SHARED IMPORTED)
    

    4. 设置第三方库所在位置

    #设置第三方库所在位置
    set_target_properties(
            imsdk
            PROPERTIES IMPORTED_LOCATION
            # {CMAKE_SOURCE_DIR} 这个地址对应的是 CMakeList.txt 地址,也就是:.../工程名/app/src/main/cpp/,我们需要定位到include文件夹下,所以得改成:${CMAKE_SOURCE_DIR}/../jniLibs
            #/${ANDROID_ABI}表示处理器架构 第三方库必须存放在这类路径下
            # 路径一定要设置正确,不然会报依赖错误(注:一定要仔细、一定要仔细、一定要仔细)
            ${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libImSDK.so
    )
    

    5. 将第三方库与目标库进行关联

    target_link_libraries( # Specifies the target library.
            imdemo
    
            ${log-lib}
    
            # 将第三方库与目标库进行关联
            imsdk
    )
    

    二:bulid.gradle 配置

    android->defaultConfig下 指定 ndk 架构,防止不兼容

    defaultConfig {
            ...
            // 指定要ndk需要兼容的架构(这样其他依赖包里mips,x86,"armeabi-v7a",arm-v8之类的so会被过滤掉
            ndk {
                abiFilters  "armeabi-v7a", "arm64-v8a"  )
            }
    
        }
    

    运行时,如果有遇到库冲突问题,需要在 android->defaultConfig添加如下配置

        defaultConfig {
           ...
    
            // 指定要ndk需要兼容的架构(这样其他依赖包里mips,x86,"armeabi-v7a",arm-v8之类的so会被过滤掉
            ndk {
                abiFilters  "armeabi-v7a", "arm64-v8a"  )
            }
            //不加这个会导致多个so冲突:https://developer.android.com/r/tools/jniLibs-vs-imported-targets
            sourceSets {
                main {
                    // The libs directory contains prebuilt libraries that are used by the
                    // app's library defined in CMakeLists.txt via an IMPORTED target.
                    jniLibs.srcDirs = ['libs']
                }
            }
        }
    

    --------至此已完成导入,后面可以不用在意。只是将 CMakeLists.txt 配置改成"通配样式"--------

    # 设置 cmake 版本
    cmake_minimum_required(VERSION 3.18.1)
    
    # 设置项目名称
    project("objName")
    
    # 设置.cpp 原文件统一管理变量 src-files
    file(GLOB src-files
            ${CMAKE_SOURCE_DIR}/*.cpp # 原文件通配路径
            ${CMAKE_SOURCE_DIR}/folder/*.cpp # 原文件通配路径
            )
    
    #添加目标库
    add_library(objName SHARED
            ${src-files})
    
    # 导入头文件
    include_directories(include)
    
    # 默认自带
    find_library(log-lib log)
    
    # 添加第三方库(xxxx表示第三方库别名)
    add_library(xxxx SHARED IMPORTED )
    
    # 设置 so库路径通用变量 jnilibs
    set(jnilibs "${CMAKE_SOURCE_DIR}/../jniLibs")
    
    # 设置第三方库对应的所在位置(xxxx表示第三方库别名)
    set_target_properties(xxxx PROPERTIES IMPORTED_LOCATION ${jnilibs}/${ANDROID_ABI}/libImSDK.so)
    
    # 设置第三方库统一管理变量 third-party-libs (xxxx表示第三方库别名)
    set(third-party-libs
            xxxx
            )
    
    # 将目标库与第三方库关联
    target_link_libraries(
            imndkdemo
            ${log-lib}
            ${third-party-libs}
    )
    

    相关文章

      网友评论

        本文标题:Android Studio 导入第三方 C/C++库

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