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

如何在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:路径错误或库未被打包进APK
  • wrong ELF class: ELFCLASS32:架构不匹配(比如用32位库在64位设备上运行)
  • undefined symbol: xxx:库依赖的其他符号缺失

内容的提问来源于stack exchange,提问作者Ben GJ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:12:30