android 加载远程Jar、APK

参考链接:

1、http://blog.csdn.net/bboyfeiyu/article/details/11710497
2 http://www.cnblogs.com/LittleRedPoint/p/3429709.html

第一步:编写接口

package com.lpl;

public interface ILoader {

public String sayHelloWorld();
}

 第二步:实现接口

package com.lpl;

public class Remote implements ILoader{

    @Override
    public String sayHelloWorld() {
        return "sayHelloWorld i am a jar";        
    } 
   
}

第三步:打包jar

使用Eclipse的Export功能,导出指定的包或者java文件

第四步:使用dx命令处理jar文件

dx --dex --output=G:
emote_dex.jar G:
emote.jar

注意:dx命令可能在platform-tools中,也可能在build-tools中的子目录中

第五步:将dex拷贝到android项目的包目录下面

1、直接放入sdcard可能会报异常,原因是android系统对sdcard的读写权限做了限制
2、需要在androidManifest中添加读写权限
3、jar需要放入到android/data/com.***目录下

第六步:

File file                = new File(Environment.getExternalStorageDirectory().toString()+File.separator+"android/data/com.example.test/remote_dex.jar");
Class lib                = null;
        
        try {
//            BaseDexClassLoader cl     = new BaseDexClassLoader(Environment.getExternalStorageDirectory().toString(), file, file.getAbsolutePath(), getClassLoader());
            DexClassLoader     cl        = new DexClassLoader(file.getAbsolutePath(), file.getPath()    , null, getClassLoader());
            lib                        = cl.loadClass("com.lpl.Remote");
          
            ILoader loader            = (ILoader)lib.newInstance();
            Toast.makeText(getApplicationContext(), ""+loader.sayHelloWorld(), 3000).show();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

// 这里要注意,APk中也要有接口文件,远程的jar只是对接口文件的实现

补充:

远程加载jar、apk有两个目的1、为了类;2、为了资源;类只要拿到jar、apk通过反射就可以拿到,资源必须拿到context
http://www.cnblogs.com/weiwelcome0/p/3583870.html
原文地址:https://www.cnblogs.com/lipeil/p/4952483.html