专栏首页移动开发面面观Android 动态加载so文件

Android 动态加载so文件

概述

在开发中,我们时常会遇到包体积过大的情况。其中,一个大的第三方so文件,经常会让人头痛。那么,能否动态加载.so文件呢?答案是可以的。

原理

我们知道,如果我们在工程中引入一个so文件,当我们用gradle编译打包时,gradle会将我们jniLibs中的so文件,打到APK包中的lib文件夹下。具体可以参考我的上篇博客

然后我们安装APK时,系统会将APK包lib文件夹中的so文件拷贝到APP的私有目录下。具体来说就是: /data/user/0/[包名]/app_libs/

所以,我们可以将想要加载的so文件,在程序运行时,拷贝到APP的私有目录的对应位置中,然后使用 System.load(...); 加载我们需要的so文件。

        String soPath = Environment.getExternalStorageDirectory().toString() + "/libnative2-lib.so";
        File file = new File(soPath);
        if (file.exists()){
            File dir = context.getDir("libs", Context.MODE_PRIVATE);
            String targetDir = dir.getAbsolutePath()+"/libnative2-lib.so";
            FileUtils.copySdcardFile(file.toString(), targetDir);
            System.load(targetDir);
        }

如有问题,欢迎指正。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android JNI 开发

    几乎稍有经验的Android开发,都会在工作中用到JNI的开发。即使工作中没有涉及到JNI的开发,在我们使用第三方的库时,也经常需要引入.so文件。

    Oceanlong
  • Android线程池的详细说明(二)

    Oceanlong
  • Android插件化——资源加载

    Oceanlong
  • Eclipse编译带so库或jar包的android应用

    使用Eclipse build APK文件,只要将so文件放在与src平级的地方创建目录结构libs/armeabi,文件名格式如:libs/armeabi/l...

    一个会写诗的程序员
  • Android JNI 开发

    几乎稍有经验的Android开发,都会在工作中用到JNI的开发。即使工作中没有涉及到JNI的开发,在我们使用第三方的库时,也经常需要引入.so文件。

    Oceanlong
  • 文件丢失?损坏?兼容性问题?到底是什么导致了错误

    在日常的维护中,免不了和文件打交道,文件涉及的问题有很多类,这里讨论: 文件丢失,损坏,兼容性问题。 而对于文件丢失导致的问题一般比较容易定位,而文件损坏,特...

    qsjs
  • Android 动态库压缩壳的实现

    计算机软件领域所说的壳实际上是一种软件加密技术。壳主要分为两大类:加密壳和压缩壳,加密壳侧重于防止软件被篡改,而压缩壳则侧重于减小软件体积。其实,在Window...

    小时光
  • SDK热更系列之如何获取应用在当前设备上的so对应的指令集

    子勰
  • LiteAVSDK集成,动态加载so库

    安卓开发中使用Android studio集成三方SDK(比如腾讯视频云移动直播、播放器、短视频、实时音视频),通常有两种集成方式:aar集成、jar+so集成...

    腾讯云-chaoli
  • ldd命令排查文件crash的问题

    ldd用来输出二进制可执行文件或者库文件的依赖;它本是一个script, 并不是binary 文件,其本质上只是设置了环境变量: D_TRACE_LOADED...

    qsjs

扫码关注云+社区

领取腾讯云代金券