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

从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:55:41