如何在Android App中调用Linux交叉编译的共享库,解决undefined symbol错误
问题根因&解决步骤
- 路径配置不匹配
你当前的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)
注意根据你实际的文件层级调整相对路径。
- 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
- ABI架构不匹配
确认你交叉编译生成libsum.so时指定的ABI架构,和当前Android项目编译的目标ABI完全匹配。如果项目build.gradle中配置了多ABI编译,需要为每个目标ABI都提供对应架构编译的libsum.so,放到对应ABI名称的目录下。
内容的提问来源于stack exchange,提问作者Sunny Gupta
相关产品推荐
相关产品推荐

