Android动态加载jar
来源:互联网 发布:java工程师培训招生 编辑:程序博客网 时间:2024/05/18 03:32
之前,被人问到Android如何动态加载jar,当时不知道,一脸蒙B,就研究了一下。
首先需要创建一个jar包,不太清楚怎么样用Android studio创建jar包的同学可以看一下我的另一篇博客Android Studio导出Jar包。
新建一个Math类
public class Math { public int getSum(int a,int b){ return a+b; }}
然后到处jar包,可以将这个类导出,也可以导出整个项目,导出math.jar。将这个jar包拷贝到Android SDK目录下的build-tools下的任意一个Android版本的文件夹里,这里我拷贝到了\build-tools\23.0.1目录下,然后打开命令提示符界面,输入命令
dx –dex –output=math_dex.jar math.jar
math_dex.jar为处理后的jar包,这也是我们需要的jar包,将这个jar包放到手机sd卡的根目录下。
然后我们新建一个项目,在Activity里写上如下代码
public void click(View view) { loadJar(); } private void loadJar(){ final File optimizedDexOutputPath = new File(Environment.getExternalStorageDirectory().toString() + File.separator + "math_dex.jar"); File dexOutputDir = getDir("dex1", 0); DexClassLoader cl = new DexClassLoader(optimizedDexOutputPath.getAbsolutePath(), dexOutputDir.getAbsolutePath(),null,getClassLoader()); Class libProviderClazz = null; try { // 载入Math类, 并且通过反射构建Math对象, 然后调用getSum方法 libProviderClazz = cl.loadClass("com.kun.math.Math"); Method m=libProviderClazz.getMethod("getSum",int.class,int.class); String result="1+2="+(int)m.invoke(libProviderClazz.newInstance(),1,2); Toast.makeText(MainActivity.this,result , Toast.LENGTH_SHORT).show(); } catch (Exception exception) { // Handle exception gracefully here. exception.printStackTrace(); } }
这里要说一下DexClassLoader的构造方法
DexClassLoader cl = new DexClassLoader(optimizedDexOutputPath.getAbsolutePath(), dexOutputDir.getAbsolutePath(),null,getClassLoader());
第一个参数是获取的jar包路径,第二个参数是将jar包解压后的路径,第三个参数是包含native库的路径,一般写null就好,第四个参数是父类的classloader对象。
当然这种方法也可以用于加载.dex文件,可以把math_dex.jar解压后的.dex文件放入sd卡中,同样也可以加载,因为方法一样这里就不多说了。
1 0
- android 动态加载jar
- android动态加载jar
- Android动态加载jar
- android动态加载jar
- android动态加载jar
- Android动态加载Jar
- Android 如何动态加载 .jar
- Android 如何动态加载 .jar
- Android动态加载jar/dex
- Android动态加载jar/dex
- Android动态加载jar/dex
- Android动态加载jar/dex
- Android动态加载jar/dex
- Android 中动态加载 .jar
- Android动态加载jar/dex
- Android动态加载jar/dex
- Android动态加载jar/dex
- Android动态加载jar/dex
- MySQL 实现调用外部程序和系统命令
- <input>text
- linux sort 多字段排序
- 基于CAShapeLayer和贝塞尔曲线的圆形进度条动画【转载】
- ASI和AFN有什么区别
- Android动态加载jar
- Learn Python The Hard Way-习题48 lexicon.py之我的实现
- int、Integer,"=="和equals() 辨别?
- 阶段总结
- 【SSH进阶之路】Struts基本原理 + 实现简单登录(二)
- char 类型转换成ascii码值
- ListView原理学习与优化总结
- ScrollView
- VC开发数据库基础之ADO篇