如何在Android应用的原生C++代码中调用.so文件的函数
C++项目链接.so动态库的实现方案
首先可以明确,使用CMake完成自研C++代码与.so动态库的链接是完全可行的,也是多文件、跨架构项目场景下的主流推荐方案。
基于CMake的链接操作步骤
前置准备
提前获取.so库对应的头文件(包含库对外暴露的函数、结构体声明),将.so库和头文件分别存入项目目录下的专用文件夹,例如lib目录存.so文件,include目录存头文件。
编写CMakeLists.txt配置
示例配置如下,你可以根据自己的项目实际路径调整:
cmake_minimum_required(VERSION 3.10) project(so_link_demo) # 配置头文件搜索路径 target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_SOURCE_DIR}/include) # 导入外部.so动态库 add_library(external_so SHARED IMPORTED) set_target_properties(external_so PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/lib/libyour_lib.so # 替换为你的.so文件实际路径 ) # 编译自研C++代码生成可执行文件 add_executable(my_app main.cpp) # 替换为你自己的C++源文件列表 # 完成动态库链接 target_link_libraries(my_app external_so)
运行时配置
编译完成后运行程序前,需要保证系统能找到.so动态库,可选操作如下:
- 临时添加库路径到环境变量:
export LD_LIBRARY_PATH=你的.so文件所在目录路径:$LD_LIBRARY_PATH - 将.so文件复制到系统默认库搜索路径,例如
/usr/lib目录 - 在CMake配置中添加运行时库路径(RPath):在target_link_libraries配置前添加
set(CMAKE_INSTALL_RPATH "$ORIGIN/lib"),编译后.so库和可执行文件按目录结构存放即可直接运行
其他可选实现方案
如果是单文件、无需复杂配置的小型项目,可以直接用g++命令行完成编译链接,操作更简便:
g++ main.cpp -I./include -L./lib -lyour_lib -o my_app
该方案仅适合简单场景,项目规模扩大后依然推荐使用CMake做构建管理,兼容性和可维护性更强。如果是Android NDK开发场景,CMake也是官方推荐的标准构建方案,无需额外切换其他工具。
注意事项
- 要保证.so动态库的编译架构和你的目标运行环境架构完全匹配,例如ARM架构的.so无法在x86设备上运行,32位.so无法在纯64位运行环境中加载
- 如果.so库是C语言编译生成的,在C代码中引入其头文件时需要用
extern "C"包裹头文件引入语句,避免C的名字修饰机制导致无法找到对应函数符号
extern "C" { #include "your_lib_header.h" }
内容的提问来源于stack exchange,提问作者Ieshaan Saxena
相关产品推荐
相关产品推荐

