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

如何在Android App中调用Linux交叉编译的共享库,解决undefined symbol错误

问题根因&解决步骤

  1. 路径配置不匹配
    你当前的CMakeLists.txt中定义的libsum.so导入路径为${distribution_DIR}/sum/lib/${ANDROID_ABI}/libsum.so,但你实际将libsum.so存放在//hello-libs/app/libs/arm64-v8a路径下,CMake无法找到对应共享库导致链接失败。
    解决方法二选一:
  • 将libsum.so移动到${distribution_DIR}/sum/lib/arm64-v8a目录下,同时把main.h放到${distribution_DIR}/sum/include目录下
  • 修改CMake中导入库的路径配置,调整为你实际存放so的路径,示例:
set_target_properties(lib_sum PROPERTIES IMPORTED_LOCATION
    ${CMAKE_CURRENT_SOURCE_DIR}/../../libs/${ANDROID_ABI}/libsum.so)

注意根据你实际的文件层级调整相对路径。

  1. C/C++符号名不匹配
    你在C文件hello-libs.cpp中调用C语言编译的libsum.so内的函数时,C编译器会默认对函数名做名字修饰(Name Mangling),导致链接时无法匹配到so内的原始C风格函数名。
    解决方法:修改main.h头文件,添加extern "C"兼容声明,修改后内容如下:
#include <stdio.h>

#ifdef __cplusplus
extern "C" {
#endif

int sum(int a, int b); 
int sub(int a, int b);

#ifdef __cplusplus
}
#endif
  1. ABI架构不匹配
    确认你交叉编译生成libsum.so时指定的ABI架构,和当前Android项目编译的目标ABI完全匹配。如果项目build.gradle中配置了多ABI编译,需要为每个目标ABI都提供对应架构编译的libsum.so,放到对应ABI名称的目录下。

内容的提问来源于stack exchange,提问作者Sunny Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:30:02