Android动态加载jar文件

这里用个例子来演示,具体流程是用Android Studio建一个Android项目并编写相应代码,然后用Eclipse编写一个java代码并打成jar包,再转换成Android能识别的dexjar包,最后先安装好APP,然后把jar包放到APP目录下,app通过反射调用jar包中的方法。

步骤

1.定义接口文件

在Eclipse中创建一个接口文件,这个接口文件也要复制一份到安卓项目中,并且包名要相同。

package com.fu.test;

/**
 * 
 * Create by Fu 
 * 2017年10月16日 下午6:19:24
 * 
 * 通用接口文件,Android项目中也需要这个文件
 * 并且包名要一致
 */
public interface ILoader {
    public String hellow();

    //计算a+b
    public int calculate(int a, int b);
}

复制一份到Android项目中同样的目录下
这里写图片描述

2.实现接口文件并生成jar包

在Eclipse中新建一个java类并实现接口,Android项目中不需要。然后通过Eclipse打成jar包,再通过Android SDK的dx工具把Eclipse生成的jar包转成Android能识别的jar包。

package com.fu.test;

/**
 * 
 * Create by Fu 
 * 2017年10月16日 下午6:30:59
 * 接口的实现类
 */
public class JarLoader implements ILoader {

    @Override
    public String hellow() {
        // TODO Auto-generated method stub
        return "我是后来保存的jar包";
    }

    @Override
    public int calculate(int a, int b) {
        // TODO Auto-generated method stub
        return a + b;
    }

}

在Eclipse中,右键工程—>Export—>Java—>JAR file
这里写图片描述

然后把生成出来的jar包复制到SDK目录下\build-tools\26.0.0中,在这里我们把jar包转成Android能识别的jar包。
在这个目录下打开cmd,或者打开cmd进入到这个目录。
执行

dx --dex --output=myloader_dex.jar myloader.jar  

生成出来的myloader_dex.jar就是我们最终要放到存储目录中的jar包。

3.通过反射加载jar文件

//拿到jar文件
File path = new File(getFilesDir() + File.separator + "myloader_dex.jar");
DexClassLoader cl = new DexClassLoader(path.getAbsolutePath(), getFilesDir().getAbsolutePath(),
        getFilesDir().getAbsolutePath(), getClassLoader());
Class myClass = null;
try {
    // 载入JarLoader类, 并且通过反射构建JarLoader对象, 然后调用sayHi方法
    myClass = cl.loadClass("com.fu.test.JarLoader");  //这里要用类的完整名称
    ILoader loader = (ILoader) myClass.newInstance();
    //因为我们这里也有接口文件,所有就能直接点出方法来
    String hellow = loader.hellow();
    int result = loader.calculate(3, 5);
    Toast.makeText(MainActivity.this, hellow + ",计算结果=" + result, Toast.LENGTH_SHORT).show();
} catch (Exception exception) {
    exception.printStackTrace();
}

4.运行APP并把jar包放入到存储空间进行测试

直接用Android Device Monitor放入jar包
放到/data/data/应用包名/files中,因为好像从安卓那个版本开始,通过反射加载dex文件不能从外部存储目录了,也就是SD卡,所以我就放到这里了,这个文件夹调用一下getFilesDir()就会自己生成。
这里写图片描述

效果图
这里写图片描述

这样我们就能实现不用重新安装APP,仅改变jar包中的方法,然后重新生成jar包,放到存储空间中,就会调用新的逻辑,当然如果改变接口文件的话就需要编译打包Android项目了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值