Android jniLibs中带版本号的.so文件未打包进APK问题
问题解答
1. 现象产生的原因
Android Gradle插件(AGP)默认遵循Android平台的共享库命名规范:仅识别lib<库名>.so格式的文件作为可打包的原生库。带有版本后缀(如.6)的libsycl.so.6不符合这一默认命名规则,因此会被构建工具忽略,不会自动复制到APK的lib目录中。而libsample.so符合标准命名,所以能正常被打包。
2. 打包libsycl.so.6的修改方案
方案一:修改AGP的资源包含规则
在Module级别的build.gradle的android代码块中添加sourceSets配置,扩展jniLibs的文件匹配规则,让AGP包含所有带版本后缀的.so文件:
android { // 保留原有所有配置... sourceSets { main { jniLibs { include '**/lib*.so*' // 匹配所有以lib开头、.so结尾(含版本后缀)的文件 } } } }
方案二:通过CMake配置处理(若该库由CMake构建)
如果libsycl.so.6是项目中通过CMake编译生成的库,可通过以下两种方式调整:
- 生成不带版本后缀的库,修改
CMakeLists.txt中的目标属性:
add_library(sycl SHARED src/sycl.cpp) set_target_properties(sycl PROPERTIES VERSION "" SOVERSION "")
- 若必须保留版本后缀,添加安装规则将文件复制到jniLibs目录:
install(TARGETS sycl LIBRARY DESTINATION ${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})
内容的提问来源于stack exchange,提问作者harry
相关产品推荐
相关产品推荐

