Android模拟器中libvsomeip3.so无法加载的问题求助
问题分析
启动vsomeip Java示例时触发java.lang.UnsatisfiedLinkError,核心原因:
libServiceVsomeipHelloWorldServiceJNI.so依赖的libvsomeip3.so未被打包进APK,加载时无法找到- 构建完成后
libvsomeip3.so被自动删除,而libvsomeip3-cfg.so等文件保留,是因为Android Gradle Plugin(AGP)默认仅打包直接被应用JNI库依赖或明确指定的库,libvsomeip3.so属于间接依赖,未被AGP检测到,因此被清理。
快速修复方案
方案1:通过CMake强制安装libvsomeip3.so到输出目录
修改顶层CMakeLists.txt,在add_subdirectory(external/vsomeip)之后添加以下代码:
# 强制将libvsomeip3.so安装到AGP识别的库输出目录 install(TARGETS vsomeip3 LIBRARY DESTINATION ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${ANDROID_ABI})
此配置会让CMake将libvsomeip3.so复制到AGP保留的路径,避免被构建后清理。
方案2:手动复制库到jniLibs目录
- 在构建完成后,从CMake输出目录(通常是
app/.cxx/cmake/debug/x86_64/)找到libvsomeip3.so - 将其复制到
app/src/main/jniLibs/x86_64/目录下(若目录不存在则手动创建) - 在
build.gradle的android块中添加以下配置,确保AGP打包该目录下的库:
sourceSets { main { jniLibs.srcDirs = ['src/main/jniLibs'] } }
方案3:明确JNI库与libvsomeip3的依赖关系(解决启用JNI模块的额外问题)
取消顶层CMakeLists.txt中#add_subdirectory(app/src/main/cpp)的注释,然后在app/src/main/cpp/的CMakeLists.txt中添加:
target_link_libraries(ServiceVsomeipHelloWorldServiceJNI PUBLIC vsomeip3)
此配置会让AGP检测到JNI库对libvsomeip3.so的直接依赖,自动打包libvsomeip3.so及其关联的libvsomeip3-cfg.so等依赖库,同时解决启用JNI模块时的缺失库问题。
额外说明
AGP的"未使用库清理"机制会自动删除未被应用代码直接依赖的库,这是导致libvsomeip3.so被清理的根本原因。通过上述方案明确依赖关系或强制保留库,即可解决问题。
内容的提问来源于stack exchange,提问作者kingvittu
相关产品推荐
相关产品推荐

