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:\remote_dex.jar G:\remote.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