从Eclipse迁移至AS后JNI库curl、jsqlite未打包进APK求助
我之前迁移Eclipse项目到Android Studio时,也踩过JNI库打包遗漏的坑,结合NDK Build的特性,给你几个实用的排查和解决方向:
1. 检查Android.mk中的库声明是否正确
这是NDK Build打包的核心配置,很容易在迁移时出错:
- 确认curl和jsqlite的
LOCAL_MODULE名称是否和实际.so文件名匹配:比如如果你的库文件是libcurl.so,那LOCAL_MODULE应该设为curl(AS会自动为生成的库添加lib前缀),名称不匹配会导致NDK Build无法识别 - 检查是否在主模块的
LOCAL_SHARED_LIBRARIES(如果是动态库)或LOCAL_STATIC_LIBRARIES(如果是静态库)中正确引用了这两个库,确保它们被纳入编译依赖链 - 确认每个库的声明末尾都有正确的编译指令:如果是预编译的.so库,要加
include $(PREBUILT_SHARED_LIBRARY);如果是从源码编译,要加include $(BUILD_SHARED_LIBRARY),漏了这行NDK Build不会处理该库
2. 统一ABI架构配置
ABI不匹配是常见的打包遗漏原因:
- 打开
Application.mk,确认APP_ABI的设置和你的.so库支持的架构一致,比如你的curl和jsqlite只编译了armeabi-v7a,那APP_ABI就不能包含arm64-v8a这类不支持的架构 - 同时在Android Studio的
build.gradle中同步ABI设置,避免AS打包时过滤掉不匹配的库:
android { defaultConfig { ndk { abiFilters 'armeabi-v7a' // 和Application.mk保持一致 } } }
3. 确认JNI库的目录配置
Eclipse和AS的JNI库默认路径不同,迁移后需要手动指定:
- AS默认的JNI库目录是
src/main/jniLibs,如果你的.so库还在原来Eclipse的libs/目录下(比如libs/armeabi-v7a/libcurl.so),需要在build.gradle中指定这个路径:
android { sourceSets { main { jniLibs.srcDirs = ['libs'] // 指向Eclipse风格的libs目录 } } }
- 务必确认这两个.so库确实存在于对应ABI的子文件夹下,不能放错层级(比如直接放在
libs/根目录下是不行的)
4. 清理缓存并重建项目
迁移后的缓存经常会导致奇怪的打包问题:
- 先执行AS菜单栏的
Build > Clean Project,然后Build > Rebuild Project - 也可以手动删除项目根目录下的
.gradle、build文件夹,以及app模块下的build文件夹,再重新构建 - 尝试用命令行构建:在项目根目录执行
gradlew clean assembleDebug,查看输出日志中的警告信息,可能会找到库未被打包的具体原因
5. 验证APK包内容
最后可以直接检查APK确认是否打包成功:
- 找到生成的APK文件,将后缀改为
.zip并解压 - 查看解压后的
lib/目录,检查对应ABI子文件夹中是否存在libcurl.so和libjsqlite.so - 如果解压后存在,那可能是运行时加载路径的问题;如果还是没有,回到前面的步骤重新排查配置
内容的提问来源于stack exchange,提问作者cabin
相关产品推荐
相关产品推荐

