当前位置: 首页 > article >正文

NDK r19之后,在Windows上用CLion配置CMake编译Android原生库的保姆级教程

NDK r19时代Windows平台CLion配置CMake编译Android原生库全指南在移动开发领域性能敏感型任务如实时图像处理、低延迟音频编码往往需要直接调用原生代码的能力。随着NDK工具链的持续演进特别是r19版本后独立工具链的默认集成开发者现在能够以更优雅的方式构建Android原生模块。本文将基于Windows平台详解如何利用CLion这一专业IDE配合CMake打造高效的NDK开发工作流。1. 环境准备与工具链配置1.1 必备组件安装开始前需确保以下组件已正确安装CLion 2021.3JetBrains推出的专业C/C IDE内置CMake支持NDK r19从Android Studio SDK Manager下载或直接获取独立包MinGW-w64提供Windows下的GNU工具链建议选择posix线程和seh异常处理版本注意NDK路径避免包含空格或中文推荐类似D:\DevTools\android-ndk-r23b的简洁路径1.2 工具链参数详解在CLion中配置工具链时File Settings Build, Execution, Deployment Toolchains关键配置项如下表配置项典型路径示例作用说明C Compiler%NDK%/toolchains/llvm/prebuilt/windows-x86_64/bin/clang.exe指定NDK内置的Clang编译器C Compiler同上路径下的clang.exeC源码编译入口Debugger%NDK%/toolchains/llvm/prebuilt/windows-x86_64/bin/lldb-server原生代码调试服务Make使用CMake默认的ninja现代构建系统替代传统make验证配置正确性的快速方法是在终端执行$NDK/toolchains/llvm/prebuilt/windows-x86_64/bin/clang --version预期应输出类似Android (7714059, based on r416183c) clang version 12.0.8... Target: x86_64-unknown-linux-gnu Thread model: posix2. CMake深度配置策略2.1 核心参数解析创建CMake配置时File Settings Build, Execution, Deployment CMake以下参数直接影响构建结果-DCMAKE_TOOLCHAIN_FILE${NDK}/build/cmake/android.toolchain.cmake -DANDROID_ABIarm64-v8a -DANDROID_NDK${NDK} -DANDROID_PLATFORMandroid-24 -DCMAKE_BUILD_TYPERelease各参数作用说明ANDROID_ABI控制目标处理器架构常见选项armeabi-v7a兼容大部分32位ARM设备arm64-v8a64位ARM主流架构x86_64模拟器常用架构ANDROID_PLATFORM对应minSdkVersion建议与app模块保持一致2.2 多ABI支持方案实际项目中常需生成多架构so库推荐采用CMake的ExternalProject模块set(ABI_LIST arm64-v8a armeabi-v7a x86_64) foreach(abi ${ABI_LIST}) set(build_dir ${CMAKE_BINARY_DIR}/build_${abi}) file(MAKE_DIRECTORY ${build_dir}) ExternalProject_Add( native-lib-${abi} SOURCE_DIR ${CMAKE_SOURCE_DIR} BINARY_DIR ${build_dir} CMAKE_ARGS -DANDROID_ABI${abi} -DCMAKE_TOOLCHAIN_FILE${ANDROID_TOOLCHAIN_FILE} INSTALL_COMMAND ) endforeach()3. 项目结构最佳实践3.1 典型目录布局高效的原生开发项目通常采用如下结构native-module/ ├── CMakeLists.txt ├── src/ │ ├── main.cpp │ └── image_processor.cpp ├── include/ │ └── image_processor.h └── jni/ └── bridge.cpp # JNI接口层对应的CMake基础配置示例cmake_minimum_required(VERSION 3.22) project(native-module LANGUAGES CXX) add_library(native-lib SHARED src/main.cpp src/image_processor.cpp jni/bridge.cpp ) target_include_directories(native-lib PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include ) find_library(log-lib log) target_link_libraries(native-lib ${log-lib})3.2 调试技巧CLion提供强大的原生代码调试能力符号断点在JNI方法名上右键添加断点内存视图调试时查看指针指向的内存区域LLDB命令直接执行memory read等低级命令调试配置示例Run Edit Configurations{ type: android, module: app, debugger: native, symbolDirectories: [$ProjectFileDir$/build/intermediates/cmake] }4. 性能优化与生产建议4.1 编译期优化通过CMake标志启用特定优化if(ANDROID_ABI STREQUAL arm64-v8a) target_compile_options(native-lib PRIVATE -marcharmv8-acrccrypto -fltothin ) endif()关键优化参数对比参数优势适用场景-O3最大速度优化发布版本-Oz最小体积优化尺寸敏感型应用-fvisibilityhidden减少符号表大小动态库开发4.2 异常处理策略NDK环境下推荐使用错误码而非C异常// 推荐方式 ErrorCode processImage(Image* img) { if (!img) return ERR_NULL_PTR; // ... } // 避免使用 try { auto result riskyOperation(); } catch (...) { // 可能引发ABI兼容问题 }5. 现代NDK特性集成5.1 C标准库选择NDK提供两种STL实现在CMake中指定# 使用LLVM的libc推荐 set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -stdliblibc) # 或显式链接 target_link_libraries(native-lib c_shared)特性对比特性libcgnustlC17支持完整部分异常处理全面支持有限支持体积较大较小5.2 预构建库集成第三方.so文件的引入方式add_library(ffmpeg SHARED IMPORTED) set_target_properties(ffmpeg PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/libffmpeg.so ) target_link_libraries(native-lib ffmpeg)处理头文件包含的推荐模式include_directories(${CMAKE_SOURCE_DIR}/third-party/include)6. 持续集成方案6.1 Windows CI配置示例GitLab CI的典型配置ndk-build: stage: build script: - $NDK/ndk-build.cmd -C $PROJECT_DIR NDK_PROJECT_PATH. NDK_APPLICATION_MKApplication.mk artifacts: paths: - libs/关键环境变量设置set ANDROID_NDK_HOMED:\android-ndk-r23b set PATH%ANDROID_NDK_HOME%;%PATH%6.2 编译缓存利用通过ccache加速重复构建find_program(CCACHE ccache) if(CCACHE) set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE}) set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE}) endif()在CLion中启用ccache安装ccache for Windows在CMake配置中添加-DCMAKE_C_COMPILER_LAUNCHERccache -DCMAKE_CXX_COMPILER_LAUNCHERccache实际项目中的构建时间对比场景无缓存有缓存全量构建4m12s4m15s增量构建1m45s23s7. 疑难问题排查7.1 常见错误代码错误现象可能原因解决方案UnsatisfiedLinkErrorABI不匹配检查apk中的lib目录结构SIGSEGV in JNI call空指针或内存越界使用AddressSanitizer调试编译时报undefined reference链接顺序错误调整target_link_libraries顺序7.2 诊断工具推荐ndk-stack解析崩溃日志adb logcat | ndk-stack -sym obj/local/armeabi-v7areadelf查看so文件信息$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin/arm-linux-androideabi-readelf -a libnative.soobjdump反汇编分析$NDK/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objdump -d libnative.so disasm.txt在完成所有配置后建议创建一个模板项目存档。笔者在实践中发现合理配置的CMake缓存可以使新项目的搭建时间缩短80%以上。对于需要频繁切换ABI的团队考虑编写Python脚本自动生成对应的CMake预设配置。

相关文章:

NDK r19之后,在Windows上用CLion配置CMake编译Android原生库的保姆级教程

NDK r19时代:Windows平台CLion配置CMake编译Android原生库全指南 在移动开发领域,性能敏感型任务(如实时图像处理、低延迟音频编码)往往需要直接调用原生代码的能力。随着NDK工具链的持续演进,特别是r19版本后独立工具…...

别急着改代码!先搞懂Eclipse C/C++索引器(Indexer)的工作原理

深入解析Eclipse CDT索引器:从原理到解决"Unresolved"报错的正确姿势 当你在Eclipse中编写C/C代码时,是否曾被突如其来的红色波浪线困扰?那些"could not be resolved"的报错明明不影响编译,却让代码看起来像布…...

AMD Ryzen处理器系统管理单元调试工具深度解析:硬件级性能调优技术揭秘

AMD Ryzen处理器系统管理单元调试工具深度解析:硬件级性能调优技术揭秘 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目…...

基于LLM与Neo4j的AI知识图谱构建与自然语言查询实践

1. 项目概述:当AI遇见知识图谱,一个开源项目的深度实践最近在GitHub上看到一个挺有意思的项目,叫robert-mcdermott/ai-knowledge-graph。光看名字,就能嗅到一股“强强联合”的味道——AI和知识图谱。这可不是简单的概念堆砌&#…...

STM32H7实战:用FMC+DMA双缓冲驱动AD7606,实现8通道同步采样的避坑指南

STM32H7高精度数据采集实战:FMCDMA双缓冲驱动AD7606的工程优化指南 在工业自动化、电力监测和医疗设备等领域,多通道同步数据采集系统的性能直接影响着整个系统的测量精度和实时性。本文将深入探讨基于STM32H7系列MCU和AD7606 ADC芯片的高性能数据采集方…...

AUTOSAR BSW模块速查手册:从ADC到XCP,一文搞懂所有缩写、文档和层级

AUTOSAR BSW模块速查手册:从ADC到XCP的工程实践指南 第一次打开AUTOSAR标准文档时,扑面而来的模块缩写就像加密电报——CanIf、Dem、NvM这些字母组合让人瞬间头大。更崩溃的是,当你试图在Stack Overflow提问时,连问题都描述不清&a…...

深入解读Xilinx SDK SPI库:XSpiPs_SetOptions参数怎么选?手把手教你配置Master模式与片选

深入解读Xilinx SDK SPI库:XSpiPs_SetOptions参数配置实战指南 在嵌入式系统开发中,SPI总线因其高速、全双工的特性成为连接传感器、存储器和外设的首选方案。Xilinx SDK提供的SPI驱动库虽然功能强大,但像XSpiPs_SetOptions这样的关键函数往往…...

AUTOSAR BSW模块速查手册:从缩写、文档到软件层级,新手快速上手指南

AUTOSAR BSW模块速查手册:从缩写、文档到软件层级,新手快速上手指南 刚接触AUTOSAR的开发者,面对密密麻麻的模块缩写和文档,常常感到无从下手。就像第一次走进大型图书馆,虽然知道里面有丰富的资源,却不知道…...

2026年制造业实战:图片格式图纸识别与FAI检验计划自动化指南

在 2026 年的数字化工厂环境中,虽然 3D MBD(基于模型的定义)已广泛普及,但在供应链协同和旧项目维护中,TIFF、PDF 以及高分辨率扫描件等非矢量图纸依然占据了约 30%的份额。如何高效完成图片格式图纸识别(i…...

番茄小说下载器:开源Rust工具的高效小说本地化解决方案

番茄小说下载器:开源Rust工具的高效小说本地化解决方案 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 你是否曾经遇到过想要离线阅读番茄小说却发现没有合适的下载…...

MAA助手终极指南:5步掌握明日方舟全自动游戏辅助工具

MAA助手终极指南:5步掌握明日方舟全自动游戏辅助工具 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https://gitc…...

NeuralBridge:为AI工作流打造的轻量级集成枢纽与MCP网关实践

1. 项目概述:一个为AI工作流打造的轻量级集成枢纽如果你正在尝试将AI驱动的自动化流程(比如基于LangChain或AutoGPT构建的智能体)连接到你的数据库、内部API或者Slack这样的协作工具,你可能会发现这并不像调用一个简单的函数那么简…...

如何快速掌握DLSS Swapper:终极免费工具提升游戏性能体验

如何快速掌握DLSS Swapper:终极免费工具提升游戏性能体验 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款专业且免费的DLSS、FSR和XeSS文件管理工具,让你能够轻松升级或降级游…...

千问 LeetCode 2258.逃离火灾 public int maximumMinutes(int[][] grid)

这是一个典型的「多源BFS 分类讨论」问题。核心思路是:先通过多源BFS计算火蔓延到每个格子的最早时间,再通过BFS计算人到达每个格子的最早时间,最后通过分类讨论确定最大等待时间。🧠 解题思路1. 计算火势蔓延时间:* 使用多源…...

macOS原生AI聚合客户端macai:SwiftUI构建,集成ChatGPT/Claude/Gemini与本地Ollama模型

1. 项目概述:macai,一个为macOS而生的全能AI聊天客户端如果你和我一样,是个重度依赖AI辅助工作的macOS用户,同时又对各种AI服务提供商(ChatGPT、Claude、Gemini、Grok……)感到眼花缭乱,那么你很…...

豆包 LeetCode 2251. 花期内花的数目 C实现

LeetCode 2251 花期内花的数目 C 语言实现 思路 把所有花的开始时间、结束时间分别拆成两个数组对两个数组排序对每个人的到达时刻 t&#xff1a; 开花数&#xff1a;开始时间 ≤ t 的花数量凋谢数&#xff1a;结束时间 < t 的花数量答案 开花数 - 凋谢数 手写二分&#xf…...

AI药物研发工程化实践:从数据管理到模型部署的全流程解析

1. 项目概述&#xff1a;从“Harness”看AI药物研发的工程化实践最近在GitHub上看到一个名为“AIDD-Projects/harness”的项目&#xff0c;这个名字起得很有意思——“Harness”&#xff0c;直译是“马具、挽具”&#xff0c;引申为“驾驭、利用”。在AI药物研发这个充满挑战的…...

豆包 LeetCode 2251. 花期内花的数目 public int[] fullBloomFlowers(int[][] flowers, int[] people)

LeetCode 2251 解题思路 最优代码 这道题是经典的差分 排序 二分问题&#xff0c;非常高频&#xff0c;最优解法时间复杂度 O(n log n m log n)。 题目理解 flowers[i] [start, end]&#xff1a;花从 start 到 end 每天都开放people[i]&#xff1a;人到达的时间要求返回&a…...

魔兽争霸3终极兼容方案:WarcraftHelper让你的经典游戏在现代电脑焕发新生

魔兽争霸3终极兼容方案&#xff1a;WarcraftHelper让你的经典游戏在现代电脑焕发新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3…...

Hitboxer:3步配置解决游戏按键冲突的SOCD清理工具

Hitboxer&#xff1a;3步配置解决游戏按键冲突的SOCD清理工具 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 你是否在玩《空洞骑士》或《蔚蓝》这类需要精准操作的游戏时&#xff0c;明明按下了正确的方向键&a…...

Windows驱动管理神器:DriverStore Explorer全面解析与实战指南

Windows驱动管理神器&#xff1a;DriverStore Explorer全面解析与实战指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 在Windows系统维护中&#xff0c;驱动程序管理往往是最容易被…...

如何快速免费解锁电脑隐藏性能:UXTU硬件调优终极完整指南

如何快速免费解锁电脑隐藏性能&#xff1a;UXTU硬件调优终极完整指南 【免费下载链接】Universal-x86-Tuning-Utility Unlock the full potential of your Intel/AMD based device. 项目地址: https://gitcode.com/gh_mirrors/un/Universal-x86-Tuning-Utility 还在为电…...

Zotero插件市场:让插件管理像逛应用商店一样简单

Zotero插件市场&#xff1a;让插件管理像逛应用商店一样简单 【免费下载链接】zotero-addons Zotero Add-on Market | Zotero插件市场 | Browsing, installing, and reviewing plugins within Zotero 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-addons 你是否…...

AI Agent统一运行时平台:从开发到部署的完整解决方案

1. 从零到一&#xff1a;为什么我们需要一个统一的AI Agent运行时平台如果你和我一样&#xff0c;在过去一两年里深度折腾过AI Agent的开发&#xff0c;那你一定经历过这样的场景&#xff1a;好不容易用LangChain或者CrewAI搭了个能跑起来的原型&#xff0c;兴奋地想把它部署上…...

循证研发服务商怎么选?重点看这五项能力

营养健康赛道的竞争&#xff0c;正在从概念表达走向证据表达。新品越来越难只靠营销概念赢得市场&#xff0c;消费者会关注原料是否可靠、配方是否有依据、吸收是否经过验证&#xff1b;渠道方评估新品时&#xff0c;也会重视产品设计逻辑和证据可信度。对品牌方来说&#xff0…...

TypeORM游标分页实战:告别LIMIT OFFSET性能瓶颈

1. 项目概述与游标分页核心价值如果你正在用 TypeORM 开发后端 API&#xff0c;并且被传统的LIMIT/OFFSET分页在数据量变大时带来的性能问题所困扰&#xff0c;那么typeorm-cursor-pagination这个库很可能就是你一直在找的解决方案。我在处理一个用户量超过百万的社交应用项目时…...

WebGPU与模型量化:浏览器端大模型本地化部署实战

1. 项目概述&#xff1a;在浏览器里跑大模型&#xff0c;到底靠不靠谱&#xff1f;最近几年&#xff0c;大语言模型&#xff08;LLM&#xff09;火得一塌糊涂&#xff0c;但一提到部署和运行&#xff0c;大家的第一反应往往是“得搞台服务器”、“得买张好显卡”、“API调用费不…...

合成数据:好、坏与未整理

原文&#xff1a;towardsdatascience.com/synthetic-data-the-good-the-bad-and-the-unsorted-8220de6aac40?sourcecollection_archive---------7-----------------------#2024-01-13 关于使用合成数据进行 AI 训练的法律视角 https://medium.com/tea.mustac?sourcepost_pag…...

OpenClaw企业级插件套件:构建安全、可观测的智能体生产环境

1. 项目概述&#xff1a;为OpenClaw构建企业级安全与智能插件套件如果你和我一样&#xff0c;正在生产环境中7x24小时地运行一个或多个OpenClaw自主智能体&#xff0c;那么你肯定也经历过那些“惊心动魄”的时刻&#xff1a;智能体在凌晨三点试图访问一个可疑的URL&#xff1b;…...

如何用Blender3mfFormat插件轻松实现3MF文件导入导出:从新手到专家的完整指南

如何用Blender3mfFormat插件轻松实现3MF文件导入导出&#xff1a;从新手到专家的完整指南 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 你是否在Blender中处理3D打印模…...