zoukankan      html  css  js  c++  java
  • Android动态加载jar/dex

    http://www.cnblogs.com/over140/archive/2011/11/23/2259367.html

    加载jar

    boolean bool = new File("/sdcard/test.jar").exists();
    		
    		DexClassLoader cl = new DexClassLoader(
    				"/sdcard/test.jar", this.getCacheDir()
    						.getAbsolutePath(), null, this.getClassLoader());
    		try {
    			Class<?> c  =  cl.loadClass("HelloWorld");
    			
    			Object obj = c.newInstance();
    			
    			Method method = c.getMethod("getHelloWord", null);
    			
    			String s = (String) method.invoke(obj, null);
    			
    			TextView tv = (TextView)findViewById(R.id.tv);
    			
    			tv.setText(s);
    			
    		} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (InstantiationException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    

      

    不要忘记:

    将jar优化时应该重新成jar(jar->dex->jar),如果如下命令:

          dx --dex --output=test.jar dynamic.jar

    加载未安装APK中的类

    public class MainActivity extends ActionBarActivity {
    
    	@SuppressLint("NewApi")
    	@SuppressWarnings("unused")
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    
    		boolean bool = new File("/sdcard/test.apk").exists();
    		
    		DexClassLoader cl = new DexClassLoader(
    				"/sdcard/test.apk", this.getCacheDir()
    						.getAbsolutePath(), null, this.getClassLoader());
    		try {
    			Class<?> c  =  cl.loadClass("com.example.testdexclassloaderloadapk.MainActivity");
    			
    			Object obj = c.newInstance();
    			
    			Method method = c.getMethod("getHelloWord", null);
    			
    			String s = (String) method.invoke(obj, null);
    			
    			TextView tv = (TextView)findViewById(R.id.tv);
    			
    			tv.setText(s);
    			
    		} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (InstantiationException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    	}
    }
    

      注意:

    1.由于是使用反射,无法取得Context,也就是TestBActivity与普通的类毫无区别,没有生命周期。

    2.做实验是出现了: Class ref in pre-verified class resolved to unexpected implementation 错误

    查看:http://blog.csdn.net/berber78/article/details/41721877

    原因是 两个工程引用了同样的 appcompat_v7 工程

     大神之作  dl 动态加载架构:

    https://github.com/singwhatiwanna/dynamic-load-apk

  • 相关阅读:
    面向对象程序设计(JAVA) 第14周学习指导及要求
    面向对象程序设计(JAVA) 第13周学习指导及要求
    面向对象程序设计(JAVA) 第12周学习指导及要求
    让小球做圆周运动,你有几种办法?
    💥2020面试准备系列(一):JS
    秒懂js的垃圾回收
    jqgrid计算表单
    CSS揭秘实用技巧总结
    利用css 实现 视觉差效果
    前端经典面试题解密:JS的new关键字都干了什么?
  • 原文地址:https://www.cnblogs.com/wjw334/p/4372676.html
Copyright © 2011-2022 走看看