Android动态加载外部jar包及jar包中图片等资源文件

Android应用程序由Java开发,因此Java中许多实用的特性,在Android中也有体现。动态加载Class,也就是外部jar包,在Java中简单的方法就是在项目的Bulid Path中导入jar,然后就可以使用jar包中的Class文件,这些,都需要java虚拟机的支持。

Android的虚拟机与java虚拟机有区别。所以在动态加载jar包上面有区别。简单来说就是android的虚拟机不能识别jar包,需要将jar包转换为可识别的dex文件(android系统可执行文件)。

Android中动态加载jar包的类,使用DexClassLoader来实现。

Jar包中可以打进android项目res文件夹下的资源文件,android中亦可以对jar包中的资源文件进行加载。

Android中加载jar包中的如txt,png等文件,使用JarFile类进行。

2.制作jar包,转换为dex文件

使用面向接口编程:

2.1写好功能接口与接口的实现。

2.2将接口打成IDynamic.jar,将接口实现打成Dynamic.jar

面向接口编程,调用jar包的项目导入接口的jar包,接口实现的jar包放在项目外部,用于调用。

2.3将功能接口的实现类的jar包转为dex文件

1)     将Dynamic.jar复制到adt-bundle-windows-x86-20131030\sdk\build-tools\android-4.4,将jar包转为android识别的dex文件。

2)     进入cmd,cd到上面的目录,执行命令:

dx  --dex --output  = Dynamic_temp.jar  Dynamic.jar

Dynamic_temp.jar是要生成的dex包。

注:jar包中可以将res中的资源打包进去。

3.使用jar包,动态加载。

1.      将接口实现类的jar包Dynamic_temp.jar导入到模拟器的sd卡上,为了方便,直接导入根目录下。

2.      将接口IDynamic.jar导入需要调用的项目中。

3.1动态加载jar包中的Class,例子是在activity中:

//动态加载类的接口

private IDynamic lib = null;

// android可执行class加载器

private DexClassLoader c1;

//动态加载外部(sd卡中)jar包的路径

privateString jarPath;

// jar解压路径,jar包中的dex文件会被解压缩

privateString jarOutputPath;

jarPath = Environment.getExternalStorageDirectory()

.toString() + File.separator + "dynamic_temp.jar";

jarOutputPath = Environment.getExternalStorageDirectory()

.toString() + File.separator + "ExtendJar";

//定义DexClassLoader

//第一个参数:是dex压缩文件的路径

//第二个参数:是dex解压缩后存放的目录

//第三个参数:是C/C++依赖的本地库文件目录,可以为null

//第四个参数:是上一级的类加载器

c1 = new DexClassLoader(jarPath, jarOutputPath, null, getClassLoader());

try {

Class> dynamic = c1

.loadClass("com.dynamic.interfacesImpl.Dynamic");

lib = (IDynamic) dynamic.newInstance();

if (lib != null) {

lib.init(MainActivity.this);

}

} catch (Exception e) {

e.printStackTrace();

}

在按钮的点击事件中调用jar中的方法:

public void onClick(View arg0) {

lib.showToast();

}

3.2动态加载jar包中的资源:图片、文本等

将jar包中打入资源文件,例子中是res/drawable-mdpi/ic_launcher.png,及jar自带的META-INF/MANIFEST.MF文件。

3.2.1解析jar包中的文本文件:

Button btn4 = (Button) findViewById(R.id.btn4);

btn4.setOnClickListener(new View.OnClickListener() {

public void onClick(View arg0) {

JarFile jarfile;

InputStream is;

try {

jarfile = new JarFile(jarPath);

is = jarfile.getInputStream(jarfile

.getEntry("META-INF/MANIFEST.MF"));

StringBuffer out=new StringBuffer();

byte[] b=new byte[4096];

for (int n; (n = is.read(b)) != -1;) {

out.append(new String(b, 0, n));

}

TextView txt = (TextView) MainActivity.this

.findViewById(R.id.textView);

txt.setText(out.toString());

is.close();

} catch (IOException e) {

//TODOAuto-generated catch block

e.printStackTrace();

}

}

});

将从jar包中读出的文本文件,以inputStream流的形式读出,再输出。

3.2.2 解析jar包中的图片

将jar包中的图片以inputStream流的形式读出,再将inputStream流转为bmp图片对象,进行使用。

Button btn3 = (Button) findViewById(R.id.btn3);

btn3.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View arg0) {

//TODOAuto-generated method stub

JarFile jarfile;

InputStream is;

try {

jarfile = new JarFile(jarPath);

is = jarfile.getInputStream(jarfile

.getEntry("res/drawable-mdpi/ic_launcher.png"));

/*

*将inputStream流转为bmp对象

*/

Bitmap bmp = BitmapFactory.decodeStream(is);

ImageView img = (ImageView) MainActivity.this

.findViewById(R.id.img);

img.setImageBitmap(bmp);

is.close();

} catch (IOException e) {

//TODOAuto-generated catch block

e.printStackTrace();

}

}

});

效果图

http://wenku.baidu.com/link?url=a_7Mz0z7EWH3JkCkqc4rFpivzkDsFVIyr-smsDqyoeAAJq4x_w4QOllzNoJp4OxjEnSmCVnGA-NAfkMdu1lWK6ahc7nI-RU3nlTOfATk58u

android jar 加入图片,Android动态加载外部jar包及jar包中图片等资源文件相关推荐

  1. php 页面加载图片卡,javascript,图片_js动态加载image导致浏览器很卡,javascript,图片 - phpStudy...

    js动态加载image导致浏览器很卡 function addImage(logo,userid,name,style){ console.log("addImage"); var ...

  2. Android插件化开发之动态加载技术简单易懂的介绍方式

    转载地方:https://segmentfault.com/a/1190000004062866 基本信息 Author:kaedea GitHub:android-dynamical-loading ...

  3. 携程Android App插件化和动态加载实践

    转载自:http://www.infoq.com/cn/articles/ctrip-android-dynamic-loading?email=947091870@qq.com 编者按:本文为携程无 ...

  4. Android插件化开发之动态加载本地皮肤包进行换肤

    Android插件化开发之动态加载本地皮肤包进行换肤 前言: 本文主要讲解如何用开源换肤框架 android-skin-loader-lib来实现加载本地皮肤包文件进行换肤,具体可自行参考框架原理进行 ...

  5. Android插件化开发之动态加载基础之ClassLoader工作机制

    类加载器ClassLoader 早期使用过Eclipse等Java编写的软件的同学可能比较熟悉,Eclipse可以加载许多第三方的插件(或者叫扩展),这就是动态加载.这些插件大多是一些Jar包,而使用 ...

  6. Android热修复技术初探(三):动态加载外部资源

    前面已经介绍了Android平台上的几种ClassLoader,这几种ClassLoader都有各自的使用场景,有了这些基础知识之后,才能更好地理解以及探究Android热修复技术.首先我们来探究怎么 ...

  7. Spark动态加载外部资源文件

    Spark动态加载外部资源文件 1.spark-submit --files 动态加载外部资源文件 之前做一个关于Spark的项目时,因项目中需要读取某个静态资源文件,然后在本地IDEA测试一切皆正常 ...

  8. Android插件化开发之动态加载三个关键问题详解

    本文摘选自任玉刚著<Android开发艺术探索>,介绍了Android插件化技术的原理和三个关键问题,并给出了作者自己发起的开源插件化框架. 动态加载技术(也叫插件化技术)在技术驱动型的公 ...

  9. Android插件化开发之动态加载技术系列索引

    动态加载介绍 在Android开发中采用动态加载技术,可以达到不安装新的APK就升级APP功能的目的,可以用来到达快速发版的目的,也可以用来修复一些紧急BUG. 现在使用得比较广泛的动态加载技术的核心 ...

最新文章

  1. dotnet new 命令使用模板生成Angular应用
  2. [Python]网络爬虫(二):利用urllib2通过指定的URL抓取网页内容
  3. maven dependency中scope=compile 和 provided区别
  4. MySQL 主键冲突,无法插入数据
  5. 浅析C++ Compile-time Assertion技术
  6. python msp_Python 练习实例71
  7. DNN:LSTM的前向计算和参数训练
  8. 小白开学Asp.Net Core 《九》
  9. P1078 文化之旅[最短路]
  10. C++之指针探究(四):指针和二维数组
  11. python中snip_我终于弄懂了Python的装饰器(三)
  12. JavaScript语法详解:运算符和表达式
  13. VIO-为什么要进行在线时间标定
  14. 计算机网络综合实践任务书,计算机网络综合实任务书2012-11.doc
  15. (一二一)核心动画基础
  16. JAVA 发送邮件功能
  17. 如何在服务器上上传手游源码,【仙变3手游】跨服服务端游戏源码+架设教程+双端+后台...
  18. Lwm2m的server分析
  19. python 抓百度招聘信息,将搜索结果解析下来,用来跟踪招聘趋势数据,免费数据变为有用的东东
  20. 外接显示器显示“HDMI电缆没有连接”怎么办?

热门文章

  1. Executor框架、ThreadPoolExecutor、3种常见的线程池
  2. 关于QSqlTableModel的使用说明(QT上创建本地SQL)
  3. DNS 流程说明以及相关问题的解析
  4. linux / 命令行 / LD_DEBUG 命令
  5. oracle插入后查不到,Oracle表刚插入数据,但是在MyEclipse中却查不到(代码完全正确)...
  6. Codeforces Round #533 (Div. 2)题解
  7. Redis集群搭建-韩国庆
  8. BZOJ1117 [POI2009]救火站Gas 贪心
  9. android-侧滑菜单
  10. canvas动画3:交互