android基于cmakelist构建so库及使用

android基于cmakelist构建so库及使用

关键点

构建及使用so文件,主要包括以下三点

  1. abifilter
  2. cmakelist
  3. build.gradle

目标

  1. 在一个工程中构建单独的so库
  2. 在另外一个工程中c++能够正常调用

构建so

此步骤主要是构建出单独的so文件,供其他工程使用

  1. 新建android native c++工程,自带了jni,cmakelist等,省的自己添加了;
  2. 修改build.gradle选项,主要是修改c++编译选项及abifilter;
  3. 添加源文件及头头文件(功能实现);
  4. 修改cmakelist.txt(控制编译及生成);

下面详细介绍下,步骤2及4;
首先需要修改build.gradle,主要是添加编译选项,及abiFilters,以及相关路径设置,参考文件注释

apply plugin: 'com.android.application'

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.1"
    defaultConfig {
    // 省略...
        externalNativeBuild {
            cmake {
                cppFlags "-std=c++17"
                abiFilters "x86_64","x86" // 控制编译出哪些abi文件,使用者需要和提供者保持一致
            }
        }
    }
    buildTypes {
        release {
    		// 省略...
        }
    }
    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt" //cmakelist文件路径
            version "3.10.2"
        }
    }
}
    // 省略...

源文件及头文件创建省略,本次测试源端目录结构如下
目录结构

cmakelist设置

cmake_minimum_required(VERSION 3.4.1)
# 源工程相关构建脚本未修改
add_library( # Sets the name of the library.
        native-lib
        SHARED
        native-lib.cpp)

# 新增构建脚本,${CMAKE_SOURCE_DIR}是一个cmake变量,其路径是cmakelist.txt所在路径
include_directories(${CMAKE_SOURCE_DIR})
add_library( # Sets the name of the library.
        ShraredLibTest # 新增模块名称
        SHARED        # 模式,static/shared
        SharedLibTest.cpp)  #源文件路径
# 查找系统库log,并将其路径赋值给log-lib
find_library( # Sets the name of the path variable.
        log-lib
        log)
#项目自带的库
target_link_libraries( # Specifies the target library.
        native-lib
        ${log-lib})
# 我们要构建的库,注意依赖
target_link_libraries( # Specifies the target library.
        ShraredLibTest
        ${log-lib})

到此,构建so的相关工作已经完成,一切正常的话,make后会在类似如下路径LibTest\app\build\intermediates\transforms\mergeJniLibs\debug\0\lib\x86中生成两个库,一个libnative-lib.so(项目自带的,我们不用);另外一个是libShraredLibTest.so,我们目标so
注意路径中x86和abifilters有关,通常情况下设置了几个,会有几个类似目录,生成针对不同平台的so,此次使用模拟器,故构建了x86。

使用so

主要包括以下步骤

  1. 拷贝文件(so及头文件)
  2. 修改build.gradle
  3. 修改代码
  4. 修改cmakelist.txt

拷贝文件
拷贝文件需要注意路径,so文件的路径,在gradle中会用到,以便把该so编译的时候打包进apk,cmakelist也会用到;头文件的路径cmakelist也会用到
结构如下,工程构建方法同上,native c++的工程,相关jni,cmakelist文件已经自动生成,本次在natvie-lib.cpp中直接调用上面的so中的方法,无需增加新的jni接口
目录结构
修改build.gradle
见文件注释

apply plugin: 'com.android.application'

android {
//...
            cmake {
                cppFlags "-std=c++17"
                abiFilters "x86_64","x86" // 控制编译出哪些abi文件,使用者需要和提供者保持一致
            }
        }
    }
//...
//设置libs文件路径,如果放置的是其他路径,需要修改成对应的相对路径
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
}

cmakelist修改
见注释


cmake_minimum_required(VERSION 3.4.1)
# 定义一个变量,表示根路径
set(ROOT_DIR ${CMAKE_SOURCE_DIR}/../../../../)
# 项目自带文件,native-lib.cpp中会调用我们的so
add_library( # Sets the name of the library.
        native-lib
        SHARED
        native-lib.cpp)
// 设置头文件路径,根据头文件放置位置修改
include_directories(${CMAKE_SOURCE_DIR})
// 引入so库,注意方式是IMPORTED
add_library( # Sets the name of the library.
        ShraredLibTest
        SHARED
        IMPORTED)
// 设置so库文件的路径
set_target_properties(ShraredLibTest
        PROPERTIES IMPORTED_LOCATION
        ${ROOT_DIR}/app/libs/${ANDROID_ABI}/libShraredLibTest.so
        )

find_library( # Sets the name of the path variable.
        log-lib
        log)
// 修改链接依赖
target_link_libraries( # Specifies the target library.
        native-lib
        ShraredLibTest
        ${log-lib})

基本上就是这么个步骤,可以参考修改
运行效果如下
在这里插入图片描述

环境
NDK 20
Cmake 3.10
Android studio 3.4
<think>嗯,用户的问题是关于在Android项目中使用VSCode配置CMakeLists.txt。我需要先理解他们的需求。他们可能是在尝试设置一个使用C/C++代码的Android项目,但不想用Android Studio,而是用VSCode。他们可能已经知道CMakeLists.txt的基本概念,但需要具体的配置步骤。 首先,我要回忆一下相关的知识。CMakeAndroid NDK开发中用于构建本地,而VSCode需要配置正确的环境变量和插件。用户可能需要安装CMakeNDK,并在VSCode中设置tasks.json来调用CMake命令。此外,他们可能需要配置launch.json来调试代码。 然后,我需要确保步骤正确。第一步是环境准备,包括安装NDKCMake和VSCode。然后配置VSCode的C++插件,比如CMake Tools。接下来是项目结构,确保有正确的目录和CMakeLists.txt文件。编写CMakeLists.txt是关键部分,需要指定NDK路径、编译选项和添加源文件。然后通过tasks.json设置构建任务,可能还要配置c_cpp_properties.json来包含头文件路径。调试配置可能需要使用lldb或其他工具。 还需要考虑用户可能的常见问题,比如路径错误,或者如何指定不同的ABI。此外,引用中的信息是否相关?引用1提到CMakeLists.txt的编写,引用3提到了VSCode和NDK的环境搭建,这些都需要整合到回答中。用户可能需要示例代码或配置片段,所以提供具体的JSON配置和CMakeLists.txt示例会有帮助。 最后,生成相关的问题,比如如何交叉编译,如何添加预编译,如何调试,这些都是用户可能会进一步询问的问题。需要确保引用的来源正确,比如引用3提到了VSCode和NDK的环境搭建,所以相关的引用标识要加上。</think>### 如何在 Android 项目中使用 VSCode 配置 CMakeLists.txt #### 1. 环境准备 - **安装 NDK**:从 Android 官网下载并配置 Android NDK,路径建议不含空格(例如 `D:\Android\ndk\版本号`)[^3]。 - **安装 CMake**:通过 Android SDK Manager 安装 CMake(默认路径为 `sdk\cmake\版本号`),或独立安装。 - **安装 VSCode 插件**: - **C/C++**(Microsoft 官方插件):提供代码高亮和调试支持。 - **CMake Tools**:用于集成 CMake 构建流程。 #### 2. 项目结构配置 ```bash 项目根目录/ ├── app/ │ ├── src/ │ │ └── main/ │ │ ├── cpp/ # C++源码目录 │ │ │ └── main.cpp │ │ └── CMakeLists.txt ├── build/ # 构建输出目录(可选) └── .vscode/ # VSCode 配置目录 ├── tasks.json ├── c_cpp_properties.json └── launch.json ``` #### 3. 编写 CMakeLists.txt ```cmake cmake_minimum_required(VERSION 3.4.1) # 设置 NDK 路径(或通过环境变量 ANDROID_NDK 传递) set(CMAKE_ANDROID_NDK "D:/Android/ndk/25.1.8937393") # 定义名称和源码 add_library(native-lib SHARED src/main/cpp/main.cpp ) # 链接系统(如日志) find_library(log-lib log) target_link_libraries(native-lib ${log-lib}) ``` 注:若需在 C++ 代码中读取 CMake 变量,可通过 `configure_file()` 传递[^2]。 #### 4. 配置 VSCode 构建任务(tasks.json) ```json { "version": "2.0.0", "tasks": [ { "label": "Build Native Lib", "type": "shell", "command": "cmake", "args": [ "-S", "${workspaceFolder}/app/src/main", "-B", "${workspaceFolder}/build", "-DANDROID_NDK=D:/Android/ndk/25.1.8937393", "-DCMAKE_BUILD_TYPE=Debug" ], "group": "build" } ] } ``` #### 5. 配置 C/C++ 头文件路径(c_cpp_properties.json) ```json { "configurations": [ { "includePath": [ "${env:ANDROID_NDK}/sysroot/usr/include" ], "defines": [] } ] } ``` #### 6. 调试配置(launch.json) ```json { "version": "0.2.0", "configurations": [ { "name": "Debug Native Code", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/build/native-lib.so", "stopAtEntry": false, "cwd": "${workspaceFolder}" } ] } ``` #### 注意事项 - **路径兼容性**:Windows 路径需使用正斜杠 `/` 或双反斜杠 `\\`。 - **ABI 支持**:通过 `-DANDROID_ABI=arm64-v8a` 指定目标架构[^1]。 - **日志输出**:在 C++ 代码中使用 `__android_log_print()` 需包含 `<android/log.h>` 头文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值