android动态加载jar包

来源:互联网 发布:移动网络机顶盒价格表 编辑:程序博客网 时间:2024/05/02 00:43
很多时候我们一些业务逻辑放在jar包中,需要时,在程序中动态加载。

Android中动态加载jar包用的是DexClassLoader类。
DexClassLoader 可以加载jar、dex、apk等类型的文件,即使没安装,也可以加载。

下面来说下实现方法:

一 先写个测试类,然后将这个测试类生成test.jar包
public class TestJar {
    public static void exec(){
        android.util.Log.e("TestJar", "*** entry TestJar exec");
    }
}

二 将生成的jar文件拷贝到android安装目录的platform-tools目录下,执行
dx --dex --output=test.jar testdex.jar

这样做的目的是:将.class的jar编译成Android虚拟机能加载的.dex的jar包。

三 将testdex.jar拷贝到手机上

四 在主程序中加载刚才jar包
String sFileDir = context.getFilesDir().getAbsolutePath() + "/TestJar.jar";
DexClassLoader dexClassLoader = new DexClassLoader(sFileDir,context.getFilesDir().getAbsolutePath(), null, context.getClassLoader());


Class TestJarClazz = null;
 try {
        TestJarClazz = dexClassLoader.loadClass("com.example.mylibrary.TestJar");
Method method = libProvierClazz.getMethod("exec", new  Class[ 0 ]);
if (method != null){
            method.setAccessible(true);
            method.invoke(null, new  Object[]{});
        }
} catch (Exception e) {
    e.printStackTrace();
}

这样就实现了动态加载jar的目的。

有个问题,如果jar中要调用的函数,需要传入在jar中定义的接口,如下面这样:
public interface ICallBack {
    void onCallBack(String sCallBack);
}

public static void addListener(ICallBack pCallBack){
        if (pCallBack != null){
            pCallBack.onCallBack("test");
        }
    }

如果要调用jar中的这个函数,该如何实现呢? 见下一篇文章。

0 0
原创粉丝点击