android 动态加载jar/dex文件

    最近一直在搞android动态加载这一块内容,感觉还是学会到了很多新的东西,下面就分享给大家。

   熟悉java的朋友,肯定知道ClassLoader这个东西,我们可以使用ClassLoader去灵活的加载某个类,但是在android中大家有可能会很陌生;大家都知道,android有自己的虚拟机(Dalvik虚拟机),这和Java的JVM还是有区别的,这里我就不做详细的介绍了,不懂得朋友可以在网上找一些资料看一下。


实际操作:

1:生成需要加载的jar;

2:把jar转换成dex;

3:DexClassLoader动态加载;

   

1:生成需要加载的jar;

 选中需要打成jar的java文件;





生成jar;



 2:把jar转换成dex;

  进入sdk安装目录,找到dx.bat所在目录,把jar复制到此目录,输入一下命令

  dx --dex --output =test_e.jar test.jar ,及会生成test_e.jar 文件;


3:DexClassLoader动态加载;

 1:把test_e.jar拷贝到手机上,代码如下;(注:我是把jar拷贝到了/data/data/目录下,要添加读写权限

  拷贝jar文件到/data/data/目录:

  

public static void copyJar(Context c){
		
	    try{
	      
	      File solocalFile = new File("/data/data/"+c.getPackageName()+"/cache/test.jar");
	      
	      byte[] arrayOfByte = new byte[65536];
	      BufferedInputStream localBufferedInputStream = new 
	    		  BufferedInputStream(c.getAssets().open("test_e.jar"));
	      BufferedOutputStream localBufferedOutputStream = new 
	    		  BufferedOutputStream(new FileOutputStream(solocalFile));
	      while (true)
	      {
	        int i = localBufferedInputStream.read(arrayOfByte);
	        if (i <= 0)
	        {
	          localBufferedOutputStream.flush();
	          localBufferedOutputStream.close();
	          localBufferedInputStream.close();
	          return;
	        }
	        localBufferedOutputStream.write(arrayOfByte, 0, i);
	      }
	    }
	    catch (Exception localException)
	    {
	      localException.printStackTrace();
	    }
	  }

 DexClassLoader动态加载jar;

 
package com.test.yu;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import com.trust.mobi.R;

import dalvik.system.DexClassLoader;
import android.support.v7.app.ActionBarActivity;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity {

	public static Method hello=null;
 
	static Object lib = null;
	
	@SuppressLint("NewApi")
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		Util.copyJar(getBaseContext());
		DexClassLoader loader = new DexClassLoader("/data/data/"+getBaseContext().getPackageName()+"/cache/test.jar", 
				"/data/data/"+getBaseContext().getPackageName()+"/cache/", null, getClassLoader());
		
		try {
			Class
    
     test = loader.loadClass("com.yu.test.cn.Test");
		 
			try {
				 lib = (Object) test.newInstance();
				 Class[] pTypes1 = new Class[1];
				 pTypes1[0] = String.class;
				 try
				{
					hello = test.getDeclaredMethod("hello", pTypes1);
				} catch (NoSuchMethodException e)
				{
					e.printStackTrace();
				}
				 
				
			} catch (InstantiationException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	 
		Toast.makeText(this, ""+hello("android动态加载jar"), Toast.LENGTH_LONG).show();
	}

	
	public String hello(String str) {
		try {
			return (String) hello.invoke(lib, str);
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return str;
	}
	
	

}

 









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值