android 动态加载sdcard jar的方法

本文介绍了一种在Android应用中动态加载外部jar文件的方法。主要包括:1. 创建Android工程并封装功能java类;2. 使用dx工具将jar包转换为android字节码;3. 通过DexClassLoader加载转换后的jar文件,实现动态调用其中的方法。
[size=large]1.新建Android工程,封装功能java类。
2.选中需要导出的文件夹,右键选中“Export”->"Java(Jar file)"导出jar文件。hello.jar
3.使用dx工具将jar包转换为android 字节码。
命令:dx --dex --output=xx.jar hello.jar

然后把xx.jar放到mnt/sdcard/ 或者其他路径

假如:hello.jar 定义如下:
package com.example.test;

public class Plug {


public int add(int a,int b){
return a+b;
}

public String test(){
return "carter";
}
}


4.使用
private void useDexClassLoader() {

String dexPath = "/mnt/sdcard/xx.jar";
String dexOutputDir = "/data/data/"+getPackageName();
Log.v(TAG, "dexOutputDir="+dexOutputDir);


DexClassLoader pathClassLoader = new DexClassLoader(dexPath, dexOutputDir, null, this
.getClass().getClassLoader());
// dexPath 目标jar或apk的路径 ; dexOutputDirdex 文件路径 ;null 目标类中使用的c/c++库存放的路径
// ; 第四个参数 父装载类
try {
[color=blue]Class class1 = pathClassLoader.loadClass("com.example.test.Plug");       //xx.jar包名+类名[/color]
Object object = class1.newInstance();
Class[] params = new Class[2];
params[0] = Integer.TYPE;
params[1] = Integer.TYPE;
Method action = class1.getMethod("add", params);
Integer ret = (Integer) action.invoke(object, 12, 13);

Log.v(TAG, "method : " + action.getName() + ", return :" + ret);



action = class1.getMethod("test");
String aa = (String) action.invoke(object);

Log.v(TAG, "method : " + action.getName() + ", return :" + aa);

} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}

}
5.这样就实现了从网络下载jar,然后不通过adb install -r 来更新apk了,这种方式适合广告类的插件,因为可以在后台动态加载,不需要弹出更新安装的对话框[/size]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值