如何在Android Studio中用C++调用动态库?加载失败求助
问题排查与解决方案
1. 核心错误:dlopen使用了Windows本地绝对路径
Android是基于Linux的操作系统,运行时你的.so文件并不在Windows的C盘路径下,而是被打包到APK的lib/${ANDROID_ABI}/目录中。直接写Windows路径会导致系统找不到库。
修改dlopen调用,使用库的文件名即可(Android的共享库通常以lib为前缀,比如你的库如果是libSharedLibrary.so,就写这个名字;如果Visual Studio生成的是SharedLibrary.so,直接写这个名字):
void callFunctionFromSharedLibrary() { void* handle = dlopen("libSharedLibrary.so", RTLD_LAZY); if(handle) { aout << "Successfully loaded shared library" << std::endl; dlclose(handle); } else { // 添加错误信息打印,定位具体问题 const char* err_msg = dlerror(); aout << "Failure to load shared library: " << (err_msg ? err_msg : "unknown error") << std::endl; } }
2. 完善CMake配置,确保库被正确打包到APK
你的CMake配置只声明了导入库,但没有将其链接到你的游戏活动目标,导致Gradle不会把这个.so打包进APK。补充以下配置:
add_library(libSharedLibrary SHARED IMPORTED) set_target_properties(libSharedLibrary PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/SharedLibrary.so ) // 替换成你的游戏活动目标名称(比如默认的native-lib) target_link_libraries(your_game_activity_target_name PRIVATE libSharedLibrary)
同时可以添加路径验证,确认CMake能找到库文件:
message(STATUS "Shared library path: ${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/SharedLibrary.so")
3. 验证Visual Studio生成的.so兼容性
- 确认生成的.so与你测试的设备/模拟器ABI完全匹配(比如模拟器用x86_64,就必须放x86_64架构的.so)
- 检查Visual Studio的Android项目配置:是否使用了与Android Studio兼容的NDK版本?API级别是否与你的游戏活动最低SDK版本匹配?不匹配的ABI或API级别会导致库无法加载。
4. 确保Android Studio识别并打包.so文件
- 确认
jniLibs目录位置正确:必须是app/src/main/jniLibs,子目录严格对应ABI名称(x86_64、arm64-v8a等) - 若IDE未识别文件,点击
File -> Sync Project with Gradle Files同步项目 - 可在
app/build.gradle中显式声明jniLibs路径,确保Gradle能找到:
android { sourceSets { main { jniLibs.srcDirs = ['src/main/jniLibs'] } } }
5. 关键调试步骤
通过dlerror()打印的错误信息,你可以快速定位问题:
cannot open shared object file: No such file or directory:路径错误或库未被打包进APKwrong ELF class: ELFCLASS32:架构不匹配(比如用32位库在64位设备上运行)undefined symbol: xxx:库依赖的其他符号缺失
内容的提问来源于stack exchange,提问作者Ben GJ
相关产品推荐
相关产品推荐

