android 动态加载sdcard jar的方法

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了,这种方式适合广告类的插件,因为可以在后台动态加载,不需要弹出更新安装的对话框

相关推荐