You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 03:36:02