讲师中心 微信公众号
AI工具推荐 视频效率加速

Android Studio中CMakeLists.txt怎么引入.so动态库

酷雪同学_9965

酷雪同学_9965

发布时间:2026-10-06 14:34:26

|

271人浏览过

|

来源于php中文网

原创

正确方式是用 add_library(xxx SHARED IMPORTED) 声明导入库,再通过 set_target_properties(xxx PROPERTIES IMPORTED_LOCATION ${LIB_PATH}) 绑定全路径(含 ${ANDROID_ABI}),最后在 target_link_libraries 中引用目标名;禁用 find_library 和裸路径链接。

android studio中cmakelists.txt怎么引入.so动态库

怎么在 CMakeLists.txt 里正确声明 add_library 引入已编译的 .so 文件

直接用 add_library 声明一个 IMPORTED 类型的库,是引入预编译 .so 的唯一可靠方式。别用 link_libraries 或裸写 target_link_libraries,它们不认路径、不认 ABI 架构、容易静默失败。

常见错误现象:编译通过但运行时报 java.lang.UnsatisfiedLinkError: dlopen failed: library "xxx.so" not found —— 大概率是没指定 IMPORTED_LOCATION,或路径写错、ABI 不匹配。

  • 必须写全路径:set(LIB_PATH ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libxxx.so),注意 ${ANDROID_ABI} 是 CMake 自动提供的变量(如 arm64-v8a),不能硬编码
  • 声明时加 SHARED IMPORTED:add_library(xxx SHARED IMPORTED)
  • 立刻用 set_target_properties 绑定路径:set_target_properties(xxx PROPERTIES IMPORTED_LOCATION ${LIB_PATH})
  • 如果 .so 有依赖其他 .so(比如依赖 libc++_shared.so),得一并声明并确保它们都在 jniLibs/ 对应 ABI 目录下

为什么 find_library 找不到你放好的 .so

find_library 只查系统路径或 CMAKE_LIBRARY_PATH 指定的路径,它不会自动扫描 jniLibs/。你手动把 .so 放进项目目录,不代表 CMake 能“看见”它。

典型误操作:写 find_library(XXX_LIB xxx PATHS ${CMAKE_SOURCE_DIR}/src/main/jniLibs/arm64-v8a) —— 这样写看似合理,但 find_library 查的是文件名不含 lib 前缀和 .so 后缀的“库名”,即它实际找的是 xxx,不是 libxxx.so;而且一旦路径里有多个 ABI 子目录,硬编码 arm64-v8a 就会让其他 ABI 编译失败。

Android Adb Skill
Android Adb Skill

Android 开发调试技能,通过系统 ADB 工具操作 Android 设备。以下场景必须触发此技能:(1) 直接 ADB 操作——安装 APK、查看设备列表、抓取 logcat 日志、查看已安装应用、清除应用数据、截图、重启设备、拉取/推送文件、查看 CPU/内存/电池信息、adb shell 操作;(2)...

下载
  • 放弃 find_library,改用 add_library(... IMPORTED) + set_target_properties
  • 路径拼接务必用 ${ANDROID_ABI},不要写死字符串
  • 检查 jniLibs/ 下是否真有对应 ABI 的目录,比如 jniLibs/arm64-v8a/libxxx.so,缺目录或文件名大小写不对都会失败

target_link_libraries 怎么写才真正链接上

声明完 IMPORTED 库之后,target_link_libraries 才能识别这个名字。但它只接受目标名(即 add_library 第一个参数),不接受路径或文件名。

容易踩的坑:写成 target_link_libraries(native-lib ${CMAKE_SOURCE_DIR}/.../libxxx.so) —— 这会触发 CMake 报错 Cannot find source file: .../libxxx.so,因为它试图把这个路径当源码去编译,而不是链接。

  • 确保 target_link_libraries 的第一个参数是你项目的 native 库名(比如 native-lib)
  • 后续跟的是已声明的 IMPORTED 目标名,例如 xxx(和 add_library(xxx ...) 一致)
  • 顺序重要:被依赖的库(xxx)要写在依赖它的库(native-lib)后面,CMake 链接顺序敏感
  • 如果 .so 依赖 libc++_shared.so,也得声明并链接:add_library(c++ SHARED IMPORTED) → set_target_properties(c++ ...) → 再一起列在 target_link_libraries 里

ABI 不匹配导致运行时找不到库的排查要点

Gradle 打包时只会把 jniLibs/${ANDROID_ABI}/ 下的 .so 打进 APK 对应目录。如果 CMake 编译出的 native 库 ABI 和你放的 .so ABI 不一致,运行时必然 dlopen failed。

最常被忽略的一点:Android Studio 默认可能只构建 arm64-v8a,但你放的 .so 是 armeabi-v7a 版本,或者反过来。

  • 确认 app/build.gradle 里的 ndk.abiFilters 和你 jniLibs/ 下实际存在的子目录严格一致
  • 在 CMakeLists.txt 开头加 message(STATUS "ABI: ${ANDROID_ABI}"),编译时看日志输出是否符合预期
  • 用 file(GLOB XXX_SO "${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libxxx.so") + message(FATAL_ERROR "Missing ${XXX_SO}") 主动报错,比运行时报错早发现
  • APK 打包后解压,检查 lib/ 目录下是否有对应 ABI 子目录及目标 .so 文件
CMake 对路径和 ABI 敏感得近乎苛刻,少一个 ${ANDROID_ABI}、多一个斜杠、名字大小写差一点,都可能让链接静默成功但运行崩溃。动手前先确认 jniLibs/ 目录结构和 abiFilters 完全对齐,比反复改 CMake 更省时间。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
android开发三大框架
android开发三大框架

android开发三大框架是XUtil框架、volley框架、ImageLoader框架。本专题为大家提供android开发三大框架相关的各种文章、以及下载和课程。

882

2023.08.14

android是什么系统
android是什么系统

Android是一种功能强大、灵活可定制、应用丰富、多任务处理能力强、兼容性好、网络连接能力强的操作系统。本专题为大家提供android相关的文章、下载、课程内容,供大家免费下载体验。

2567

2023.08.22

android权限限制怎么解开
android权限限制怎么解开

android权限限制可以使用Root权限、第三方权限管理应用程序、ADB命令和Xposed框架解开。详细介绍:1、Root权限,通过获取Root权限,用户可以解锁所有权限,并对系统进行自定义和修改;2、第三方权限管理应用程序,用户可以轻松地控制和管理应用程序的权限;3、ADB命令,用户可以在设备上执行各种操作,包括解锁权限;4、Xposed框架,用户可以在不修改系统文件的情况下修改应用程序的行为和权限。

4817

2023.09.19

android重启应用的方法有哪些
android重启应用的方法有哪些

android重启应用有通过Intent、PendingIntent、系统服务、Runtime等方法。本专题为大家提供Android相关的文章、下载、课程内容,供大家免费下载体验。

625

2023.10.18

Android语音播放功能实现方法
Android语音播放功能实现方法

实现方法有使用MediaPlayer实现、使用SoundPool实现两种。可以根据具体的需求选择适合的方法进行实现。想了解更多语音播放的相关内容,可以阅读本专题下面的文章。

924

2024.03.01

C++ 跨平台开发
C++ 跨平台开发

本专题聚焦 C++ 在跨平台应用与工程构建中的实战应用,系统讲解 CMake 构建系统、跨平台编译配置、第三方库集成、调试技巧、静态与动态链接库管理等核心知识。通过实战案例(如跨平台工具开发、Linux与Windows编译兼容性项目),帮助学习者掌握 从环境配置到完整跨平台构建的开发能力。

5966

2025.10.17

c++  cmake用法
c++ cmake用法

本专题整合了c++ cmake用法相关教程,阅读专题下面的文章了解更多详细内容。

1491

2025.10.23

C++ 编译构建系统与CMake实战
C++ 编译构建系统与CMake实战

本专题聚焦 C++ 项目的编译与构建体系,系统讲解 CMake 的核心语法、项目结构设计、库与依赖管理、跨平台构建、调试与发布配置。通过完整项目示例,帮助开发者掌握 从源码到可执行程序的工程化构建流程,提升 C++ 项目在实际开发中的可维护性与扩展性。

354

2025.12.13

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

80

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
swift开发文档
swift开发文档

共33课时 | 43.4万人学习

尚学堂Swift入门视频教程
尚学堂Swift入门视频教程

共44课时 | 16.6万人学习

SSDB数据库使用手册
SSDB数据库使用手册

共21课时 | 24.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn