qingfengzaishou 2016-12-13
1.新建Android工程,封装功能java类。
2.选中需要导出的文件夹,右键选中“Export”->"Java(Jarfile)"导出jar文件。hello.jar
3.使用dx工具将jar包转换为android字节码。
命令:dx--dex--output=xx.jarhello.jar
然后把xx.jar放到mnt/sdcard/或者其他路径
假如:hello.jar定义如下:
packagecom.example.test;
publicclassPlug{
publicintadd(inta,intb){
returna+b;
}
publicStringtest(){
return"carter";
}
}
4.使用
privatevoiduseDexClassLoader(){
StringdexPath="/mnt/sdcard/xx.jar";
StringdexOutputDir="/data/data/"+getPackageName();
Log.v(TAG,"dexOutputDir="+dexOutputDir);
DexClassLoaderpathClassLoader=newDexClassLoader(dexPath,dexOutputDir,null,this
.getClass().getClassLoader());
//dexPath目标jar或apk的路径;dexOutputDirdex文件路径;null目标类中使用的c/c++库存放的路径
//;第四个参数父装载类
try{
Classclass1=pathClassLoader.loadClass("com.example.test.Plug"); //xx.jar包名+类名
Objectobject=class1.newInstance();
Class[]params=newClass[2];
params[0]=Integer.TYPE;
params[1]=Integer.TYPE;
Methodaction=class1.getMethod("add",params);
Integerret=(Integer)action.invoke(object,12,13);
Log.v(TAG,"method:"+action.getName()+",return:"+ret);
action=class1.getMethod("test");
Stringaa=(String)action.invoke(object);
Log.v(TAG,"method:"+action.getName()+",return:"+aa);
}catch(Exceptione){
//TODO:handleexception
e.printStackTrace();
}
}
5.这样就实现了从网络下载jar,然后不通过adbinstall-r来更新apk了,这种方式适合广告类的插件,因为可以在后台动态加载,不需要弹出更新安装的对话框