Android 网络加载动态库 .so

这几天做项目时遇到一个问题,共17M的Apk,仅两个.so文件就占到14M,就尝试着用户安装完app之后,根据用户需要再加载.so文件,找了之后,方法倒不复杂。

1. .so文件的网络下载部分就不展示,

2. .so文件存放路径:一般建议存放在 data/data/<packageName>/路径下,代码如下:

    //getFileDir() :/data/data/<packageName>/file/
    File file2 = new File(getFilesDir(), "libBankeysCoreApi.so");
    try {
            //fos = openFileOutput("libBankeysCoreApi.so", Context.MODE_PRIVATE); //第一个参数:文件名,不允许包含分隔符“/”,如果文件不存在,android会自动创建
                                                            //第二个参数:指定操作模式                                     //有网友推荐这样使用,但试过之后会保存,提示 "/data/data/<packageName>/app_" 是个路径的错误                                                            //我放弃这个办法
            fos = new FileOutputStream(file2.getAbsoluteFile());
            fos.write(b);
            fos.close();
            Log.e("TAG", "" + true + ";" + file2.getAbsolutePath());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            Log.e("TAG", e.getMessage());
        } catch (IOException e) {
            e.printStackTrace();
            Log.e("TAG", e.getMessage());
        }
        System.load(file2.getAbsolutePath());

另外:lib下库一般会在/data/data/<packageName>/lib/下备份,调用方法做个改动,如下:

System.loadLibrary("");

另,附上:

getPackageCodePath():/data/app/com.example.download.sotest-2.apk
getFilesDir():/data/data/com.example.download.sotest/files
getPackageResourcePath():/data/app/com.example.download.sotest-2.apk
getCacheDir():/data/data/com.example.download.sotest/cache
getExternalCacheDir():/storage/emulated/0/Android/data/com.example.download.sotest/cache
getObbDir():/storage/emulated/0/Android/obb/com.example.download.sotest
getFilesDir():/data/data/com.example.download.sotest/files

上面部分我试过之后是可行的,希望能帮到大家。

时间: 2024-11-04 07:53:55

Android 网络加载动态库 .so的相关文章

【转载】cocos2dx 中 Android NDK 加载动态库的问题

原文地址:http://blog.csdn.net/sozell/article/details/10551309 cocos2dx 中 Android NDK 加载动态库的问题 闲聊 最近在接入各个平台的SDK,遇到了不少问题,也从中了解了不少知识,之前一直觉得没啥好写的,毕竟做了4个月的游戏开发,也没有碰上什么真正的大问题,cocos2dx的引擎包得也很好,能让人把大部分时间都关注在游戏逻辑.效果的处理上,当然,之前的libevent还是小坑一下,但是和后来遇到的相比,也算不上什么了. 我最

Ubuntu linux设置从当前目录下加载动态库so文件

linux的excutable在执行的时候缺省是先搜索/lib和/usr/lib这两个目录,然后按照ld.so.conf里面的配置搜索绝对路径,linux缺省是不会在当前目录搜索动态库的.windows加载动态库的时候,缺省是首先加载本地目录下的动态库,然后再搜索windows/system和windows/system32目录. windows的动态库搜索顺序,虽然有可能会造成潜在的混乱,但是对于开发和测试无疑是比较方便的,尤其是debug和release版本的动态库需要经常切换进行测试的时候

Linux下c函数dlopen实现加载动态库so文件代码举例

dlopen()是一个强大的库函数.该函数将打开一个新库,并把它装入内存.该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的.这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了.可以在自己的程序中使用 dlopen().dlopen() 在 dlfcn.h 中定义,并在 dl 库中实现.它需要两个参数:一个文件名和一个标志.文件名就是一个动态库so文件,标志指明是否立刻计算库的依赖性.如果设置为 RTLD_NOW 的话,则立刻计算:如果设置的是 RTLD_LAZY,则在需要

LoadLibrary加载动态库失败

LoadLibrary加载动态库失败的可能原因以及解决方案: (1)dll动态库文件路径不对.此场景细分为以下几种情况: 1.1 文件路径的确错误.比如:本来欲加载的是A文件夹下的动态库a.dll,但是经过仔细排查原因,发现a.dll动态库竟然被拷贝到B文件夹下去了. 若真遇到这种低级错误,建议你找个没人的墙角蹲下用小拇指逆时针划圈圈去吧... 1.2 实参传值错误.比如:实参类型为LPCWTR,经常都会因为字符串转换导致实参事与愿违. 网上的经验总结实例.某程序员经过一番周折后通过以下语句调用

android 网络加载图片,对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存

经常会用到 网络文件 比如查看大图片数据 资源优化的问题,当然用开源的项目  Android-Universal-Image-Loader  或者 ignition 都是个很好的选择. 在这里把原来 写过的优化的代码直接拿出来,经过测试千张图片效果还是不错的. 免费培训课:http://www.jinhusns.com/Products/Curriculum/?type=xcj 工程目录 至于 Activity 就是加载了 1个网格布局 01./** 02.*   实现 异步加载 和   2级缓

android 网络加载图片

通过网络链接加载网络图片 加权限,允许访问网络 <uses-permission android:name="android.permission.INTERNET"/> MainActivity package com.chuanxidemo.shaoxin.demo08; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; imp

macOS下加载动态库dylib报&quot;code signature invalid&quot;错误的解决办法

一.现象描述 在macOS上搞开发也有一段时间了,也积攒了一定的经验.然而,今天在替换工程中的一个动态库时还是碰到了一个问题.原来工程中用的是一个静态库,调试时发现有问题就把它替换成了动态库.这本来没什么值得一说,可工程编译完后打包测试时发现,不论怎么搞程序都加载不起来.毫无疑问,这是新替换的动态库带来的问题. 二.解决办法 于是尝试打开日志文件看看有什么发现吧: 根据上面的日志文件提示,动态库加载的时候失败了.原因为:code signature invalid.这就奇了个怪了,以前都没碰到类

Java 加载动态库 dll 文件

不知道具体原理,但是,加载 dll 文件时,带路径或者更改 dll 文件的名字,都会报错.虽然库记载成功了,但是处女座认为这不可接受.于是有了这个解决方案. 在根目录为库创建软连接,然后使用 system.loadLibrary(“libname”) 来加载.事实证明,它时认软连接的. 上代码: import com.seapine.surroundscm.api.*; import java.lang.UnsupportedOperationException; import java.lan

cmake中设置ELF文件加载动态库的位置

1. 三个文件 1. world.c #include<stdio.h> void world(void) { printf("world.\n"); } 2. hello.c #include <stdio.h> void world(void); void hello(void) { printf("hello\n"); world(); } 3. main.c void main(void) { hello(); } 2. 编译动态库