Android动态加载Jar

来源:互联网 发布:2017淘宝法律法规纳税 编辑:程序博客网 时间:2024/05/17 21:07

定义接口, 把实现接口的部分打包成jar 在

将打包好的jar拷贝到SDK安装目录android-sdk-windows\platform-tools下,DOS进入这个目录,执行命名:

dx --dex --output=test.jar update.jar

核心加载代码


@SuppressLint("NewApi")

private void executeLoadDex() {
// sd中创建的动态加载新文件夹
// public static final String DYNAMIC_FOLDER_PATH = new StringBuilder(
// Environment.getExternalStorageDirectory().getAbsolutePath()).append(File.separator).append("MCC_DYNAMIC")
// .toString();
// // 动态加载jar名称
// public static final String DYNAMICLOAD_JAR_NAME = "update.jar";

File optimizedDexOutputPath = new File(
Constant.DYNAMIC_FOLDER_PATH + File.separator + Constant.DYNAMICLOAD_JAR_NAME);


if (optimizedDexOutputPath.exists()) {
WLog.i("optimizedDexOutputPath.exists()");
/**
* 定义DexClassLoader //第一个参数:是dex压缩文件的路径 //第二个参数:是dex解压缩后存放的目录
* //第三个参数:是C/C++依赖的本地库文件目录,可以为null //第四个参数:是上一级的类加载器
*/
File dexOutputDir = Utils.getContext().getDir("dex", 0);
DexClassLoader cl = new DexClassLoader(optimizedDexOutputPath.getAbsolutePath(),
dexOutputDir.getAbsolutePath(), null, getClassLoader());


try {
Class<?> libClass = cl.loadClass("com.example.javasdk.dynamic.JarILoaderimpl");
WLog.i("optimizedDexOutputPath.exists()" + libClass);
ILoader lib = (ILoader) libClass.newInstance();
Toast.makeText(Utils.getContext(), "CoreService" + lib.sayHi(), Toast.LENGTH_SHORT).show();
WLog.i("CoreService  executeLoadDex lib.startAllTask()");
// lib.startAllTask();
} catch (Exception e) {
WLog.e("CoreServiceException" + e.toString());
e.printStackTrace();
}
}
}