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