文档章节

Android之ClassLoader和插件

h
 houj
发布于 2015/12/22 09:32
字数 327
阅读 68
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

Android之ClassLoader和插件


Android中的ClassLoader本质上跟JRE中的一样,但Android的字节码格式不一样,Android下的ClassLoader不能直接加载普通的jar包,需要使用dex2jar工具中的d2j-jar2dex.bat,  把jar转换为classes.dex,然后把classes.dex放到jar文件中作为ClassLoader的源数据;

1)我们先生成一个Android需要的JAR;
源码:
package test;

public class AnPluginDemo {
   public int getValue() {
      return 100;
   }
}
2)打包成jar;
3)使用dex2jar工具中的d2j-jar2dex.bat, 把jar转换为classes.dex;
4)把classes.dex放到一个新的jar中, AnPluginDemo.jar;
5)建立一个Android工程;
6)把AnPluginDemo.jar放到assets下;
7)加载插件并运行
void loadAndInvoke(String name) {
      try {
         File dir = getDir("plugin", Context.MODE_PRIVATE);

         byte[] bs = readDataFromAsserts("plugin/" + name);// 读取插件数据
         String path = new File(dir, name).getAbsolutePath();// 插件保存的位置
         Files.writeFile(path, bs);// 保存插件

         // 创建类加载器,把dex加载到虚拟机中
         DexClassLoader loader = new DexClassLoader(//
               path,//插件路径,可以用冒号分隔多个,  可以是jar(内有classes.dex)或apk格式
               dir.getAbsolutePath(),//优化后保存的目录
               null,//so文件位置
               this.getClass().getClassLoader()//父ClassLoader
         );

         Class<?> c = loader.loadClass("test/AnPluginDemo");// 加载需要使用的类
         Method m = c.getMethod("getValue");// 取得方法
         Object o = c.newInstance();// 创建对象
         Object r = m.invoke(o);// 调用方法
         showTipDialog("R:" + r);//显示执行结果
      } catch (Exception e) {
         e.printStackTrace();
         showTipDialog("R:" + e.getClass());
      }
   }
h
粉丝 10
博文 81
码字总数 57985
作品 0
长沙
技术主管
私信 提问
加载中
请先登录后再评论。
浅入浅出Android(003):使用TextView类构造文本控件

基础: TextView是无法供编辑的。 当我们新建一个项目MyTextView时候,默认的布局(/res/layout/activity_main.xml)中已经有了一个TextView: <TextView 运行效果如下: 修改其文本内容...

樂天
2014/03/22
706
1
Nutch学习笔记4-Nutch 1.7 的 索引篇 ElasticSearch

上一篇讲解了爬取和分析的流程,很重要的收获就是: 解析过程中,会根据页面的ContentType获得一系列的注册解析器, 依次调用每个解析器,当其中一个解析成功后就返回,否则继续执行下一个解...

强子哥哥
2014/06/26
712
0
树莓派(Raspberry Pi):完美的家用服务器

自从树莓派发布后,所有在互联网上的网站为此激动人心的设备提供了很多有趣和具有挑战性的使用方法。虽然这些想法都很棒,但树莓派( RPi )最明显却又是最不吸引人的用处是:创建你的完美家用...

异次元
2013/11/09
7.5K
8
程序猿媛一:Android滑动翻页+区域点击事件

滑动翻页+区域点击事件 ViewPager+GrideView 声明:博文为原创,文章内容为,效果展示,思路阐述,及代码片段。文尾附注源码获取途径。 转载请保留原文出处“http://my.oschina.net/gluoyer...

花佟林雨月
2013/11/09
4.3K
1
表单验证插件--Jquery表单验证插件

目前支持对以下格式的值进行验证: cnum-(纯数字), char-(纯字母), zwen-(中文), bysc-(字母开头), mail(邮箱), yzbm(邮政编码) 其中的‘’表示长度,比如“zwen1-5”表示中文1-5位的长度。同...

huanganiu
2013/01/23
4.4K
0

没有更多内容

加载失败,请刷新页面

加载更多

Visa首次发行5亿美元绿色债券和任命首席可持续发展官,扩大对可持续发展的承诺

旧金山--(美国商业资讯)--全球领先的支付技术公司Visa (NYSE: V)今天宣布,公司昨日已成功为其首次发行的总计5亿美元的绿色债券定价,将支付0.75%的半年息票率,2027年8月15日到期。该绿色债...

osc_zjm9j6vk
43分钟前
23
0
Perceptive Advisors携手多个战略联盟创立联拓生物(LianBio)并建构营运平台

联拓生物与BridgeBio Pharma、MyoKardia、BridgeBio Pharma子公司Navire Pharma和QED Therapeutics合作,在中国和亚洲主要市场开发尖端疗法并进行商业化,将创新科学业务拓展至全球,并建立了...

osc_923iryp1
44分钟前
0
0
导入Maven项目时jar包依赖配置失败:Failed to read artifact descriptor for xxx

导入Maven项目时有时会遇到无法自动配置Configrations和yml文件的情况,完了去配置里一看,Library是空的。maven导入jar包的时候应该出了问题。如图操作maven提示重新import change即可。...

osc_45mm6g1p
45分钟前
15
0
SpringBoot手动装配,自定义Enable模块

前言 前面我们介绍了简单详细的SpringBoot自动配置原理解析,今天这篇文章主要是介绍下如何是实现手动配置,自定义Enable模块, 基于注解驱动实现 基于注解的驱动实现是最基本的自定义Enabl...

osc_m8arvi7m
46分钟前
0
0
Esp8266 Web Server 应用实例 - Simple Web Console

Esp8266 Web Server 应用实例 - Simple Web Console 本文旨在向读者介绍使用Esp8266 WiFi板搭建Web Server应用的原理。示例向读者展示了如何创建Web Console,以及如何使Web Console与NodeM...

osc_xdc1vjza
47分钟前
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部