Android之ClassLoader和插件
2015-12-22 00:00
597 查看
摘要: Android之ClassLoader和插件
1)我们先生成一个Android需要的JAR;
源码:
3)使用dex2jar工具中的d2j-jar2dex.bat, 把jar转换为classes.dex;
4)把classes.dex放到一个新的jar中, AnPluginDemo.jar;
5)建立一个Android工程;
6)把AnPluginDemo.jar放到assets下;
7)加载插件并运行
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()); } }
相关文章推荐
- Android读取SQLite数据库中的中文
- Android之Bitmap的内存优化方案总结
- android之旅2: 五种布局
- Android Studio——用Android访问本地站点---(localhost,10.0.2.2)要区别
- android设计模式之mvp详解
- Android Handle机制浅析
- android如何保存读取读取文件文件保存到SDcard
- Android-Session Initiation Protocol(SIP)
- android中细节效果总结
- android EditText 设置密码明文 密文 显示方法
- android布局常用属性记录
- android之ListView,详细介绍实现步骤,举例,自定义listview适配器
- android之保存偏好设置信息到shareSharedPreferences,轻量级的保存数据的方法
- android源码分析之大字体
- android单选按钮选择,RadioGroup,radioButton
- Android sdk开发 - 序
- Android AsyncTask 源码分析
- Android中短信分享功能的实现
- 微软安卓模拟器(Visual Studio Emulator for Android)无法联网解决办法
- Android不用OnScrollListener采用GestureDetector结合OnTouchListener实现ListView下拉/上拉刷新