android 动态加载sdcard jar的方法

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 {
            Class class1 = pathClassLoader.loadClass("com.example.test.Plug");       //xx.jar包名+类名
            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了,这种方式适合广告类的插件,因为可以在后台动态加载,不需要弹出更新安装的对话框

猜你喜欢

转载自zhaweijin.iteye.com/blog/2344707