一、背景
在开发Android应用程序的实现,有时候需要引入第三方so lib库,但第三方so库比较大,例如开源第三方播放组件ffmpeg库, 如果直接打包的apk包里面, 整个应用程序会大很多.经过查阅资料和实验,发现通过远程下载so文件,然后再动态注册so文件时可行的。主要需要解决下载so文件存放位置以及文件读写权限问题。
二、主要思路
1、首先把so放到网络上面,比如测试放到:http://codestudy.sinaapp.com/lib/test.so
2、应用启动时,启动异步线程下载so文件,并写入到/data/data/packageName/app_libs目录下面
3、调用System.load 注册so文件。因路径必须有执行权限,我们不能加载SD卡上的so,但可以通过调用context.getDir("libs", Context.MODE_PRIVATE)把so文件写入到应用程序的私有目录/data/data/packageName/app_libs。
三、代码实现
1、网络下载so文件,并写入到应用程序的私有目录/data/data/PackageName/app_libs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
/** * 下载文件到/data/data/PackageName/app_libs下面
* @param context
* @param url
* @param fileName
* @return
*/
public static File downloadHttpFileToLib(Context context, String url, String fileName) {
long start = System.currentTimeMillis();
FileOutputStream outStream = null ;
InputStream is = null ;
File soFile = null ;
try {
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
HttpResponse response = client.execute(get);
HttpEntity entity = response.getEntity();
File dir = context.getDir( "libs" , Context.MODE_PRIVATE);
soFile = new File(dir, fileName);
outStream = new FileOutputStream(soFile);
is = entity.getContent();
if (is != null ) {
byte [] buf = new byte [ 1024 ];
int ch = - 1 ;
while ((ch = is.read(buf)) > 0 ) {
outStream.write(buf, 0 , ch);
//Log.d(">>>httpDownloadFile:", "download 进行中....");
}
}
outStream.flush();
long end = System.currentTimeMillis();
Log.d( ">>>httpDownloadFile cost time:" , (end-start)/ 1000 + "s" );
Log.d( ">>>httpDownloadFile:" , "download success" );
return soFile;
} catch (IOException e) {
Log.d( ">>>httpDownloadFile:" , "download failed" + e.toString());
return null ;
} finally {
if (outStream != null ) {
try {
outStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (is != null ) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
|
2、调用System.load 注册so文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
new Thread( new Runnable() {
@Override
public void run() {
File soFile = FileUtils.downloadHttpFileToLib(getApplicationContext(), "http://codestudy.sinaapp.com//lib/test.so" , "test.so" );
if (soFile != null ) {
try {
Log.d( ">>>loadAppFile load path:" , soFile.getAbsolutePath());
System.load(soFile.getAbsolutePath());
} catch (Exception e) {
Log.e( ">>>loadAppFile load error:" , "so load failed:" + e.toString());
}
}
}
}).start(); |
四、需要解决的问题
1、so文件下载以及注册时机。测试发现libffmpeg.so 8M的文件单线程下载需要10-13s左右
2、so下载失败或者注册失败该怎么处理。例如so播放组件是否尝试采用android系统原生MediaPlayer进行播放
3、当初次so还没有下载完注册成功时,进入播放页面时,需要友好提示用户,比如loading 视频正在加载等等
4、无网络情况等等情况
五、说明
上面的demo经过3(2.3/4.2/4.4)实际机型测试可以正常使用,然后根据第四点列举问题完善以下,即可使用。
Android KSOAP2调用.net webservice
jQuery教程(8)-DOM树操作之使用反向插入方法
android学习笔记(34)使用AlertDialog创建简单对话框
android学习笔记(33)画廊视图(Gallery)的功能和用法
android navidgation drawer 在导航抽屉中如何改变List选中项的...
相关推荐
android项目成为lib库,和主项目中使用lib库中的数据和布局 博客地址: http://blog.csdn.net/pangzaifei/article/details/24368451
ncnn 是一个为手机端极致优化的高性能神经网络前向计算框架。ncnn-android-lib是ncnn编译好的android lib,可以直接使用
Android引用包含远程依赖库的aar(引用aar时找不到arr的远程依赖库问题); aar引用很简单,将sdk-zhousf-1.0-20170907.054540-1.aar复制到libs包下,在项目的build.gradle文件中增加以下代码即可: compile(name:'sdk-...
Basic4android 2.52扩展库
QtXlsx开源库 编译好的静态库lib和动态库dll win7 下 vs2010+qt5.5 使用QtXlsx开源库
// so2lib.cpp : create a lib export table for vc by dll/so. // 1.2 by philsong@techtrex.com // modify base at a project "CodeProject Create your Proxy DLLs automatically", // reference 《为无LIB...
解决undefined reference to `__system_property_get'问题,这是android arm平台64位libc.so,来源路径:/system/lib64/libc.so,具体看我的文章:http://blog.csdn.net/luoyong123456/article/details/50587417
setupapi.lib&hid.lib库/dll/Win/x86/x64 【实例简介】 64&32位的hid.lib和setupapi.lib文件, 请注意是amd64 文件包括: hidusage.h hid.lib hidsdi.h hidpi.h setupapi.lib setupapi.h 【实例截图】 【核心代码】 ...
编译好的安卓上面的 openssl库 openssl_lib_android openssl_lib_android openssl_lib_android
dbghelp lib库和dll库。解决Qt编译报错"error: undefined reference to `MiniDumpWriteDump'
将c程序编成动态链接库,在java界面中通过JNI调用它,并能打包成一个apk安装.以下为能在Android源码树中编译的全部例程源码和脚本
关于pdflib的 库和头文件 二次开发的不可或缺的 库文件
VLC-Android 库 libiomx-gingerbread.so libiomx-hc.so libiomx-ics.so libvlcjni.so 直接加载使用就好了。省去你自己编译的麻烦。
ad18lib库
介绍静态链接库lib和动态链接库dll区别
winscard.lib库文件,winscard.lib库文件winscard.lib库文件winscard.lib库文件winscard.lib库文件winscard.lib库文件
2022年2月份最新的so.
ws2-32.Lib库文件,下载后放入C:\Program Files\Microsoft SDKs\Windows\v7.0A\Lib
├─amd64 │ atl.lib │ atls.lib │ atlsd.lib │ atlthunk.lib │ ├─i386 │ atl.lib │ atls.lib │ atlsd.lib │ atlthunk.lib │ └─ia64 atl.lib atl21asm.lib atls.lib atlsd.lib
百度地图