Android 动态加载so文件

2019-02-22 10:14:36 浏览数 (1)

概述

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

原理

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

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

/data/user/0/[包名]/app_libs/

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

System.load(...);

加载我们需要的so文件。

代码语言:javascript复制
        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 人点赞