Android动态加载jar

之前,被人问到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
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值