android 动态加载sd卡的jar文件

下面以一个例子列出android程序运行时动态加载sd卡jar包的步骤:


1. 首先要准备好jar包。

本例中要对com.test.dynamic包进行打包,com.test.dynamic包下面有一个MyClass类.代码如下:

package com.test.dynamic;

import android.util.Log;

public class MyClass {
	public MyClass() {
		Log.d("com.test.dynamic", "MyClass:constructor called");
	}

	public void doSomething() {
		Log.d("com.test.dynamic", "MyClass:doSomething called");
	}
}

eclipse中选择com.test.dynamic包,使用export导出得到test.jar. 接下来一定不能忘记使用dx命令对test.jar处理,否则的话会报java.lang.ClassNotFoundException异常.dx命令位于sdk\build-tools\android-4.4W下面(android-4.4W是android的一个版本,其他android版本下面也能找到dx.bat). cmd命令行模式下进入dx.bat所在目录,使用dx --dex --output=dynamic.jar test.jar ,dynamic.jar是对test.jar处理后得到的jar文件.


2. 把dynamic.jar 拷贝到手机的sd卡目录下,删除掉eclipse项目中的com.test.dynamic包

不同的手机sd卡目录不太一样,比如本人使用的魅族3手机sd卡目录是\storage\emulated\0.如果不知道手机sd卡目录的话,大家可以打印Environment.getExternalStorageDirectory()信息来查看sd卡目录.


3.android程序运行时动态加载sd卡中的jar包

下面简单写了一个Activity来动态加载jar,代码如下:

package com.dynamicLoading;

import java.io.File;
import java.lang.reflect.Method;
import dalvik.system.DexClassLoader;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;

public class Main extends Activity {
	@SuppressLint("NewApi")
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		String libPath = Environment.getExternalStorageDirectory()+ File.separator + "dynamic.jar"; // 要动态加载的jar 
		File dexDir = getDir("dex", MODE_PRIVATE); // 优化后dex的路径
		
		/**
		 * 进行动态加载,利用java的反射调用com.test.dynamic.MyClass的方法
		 */
		DexClassLoader classLoader = new DexClassLoader(libPath, dexDir.getAbsolutePath(), null, getClassLoader());
		try {
			Class<Object> cls = (Class<Object>) classLoader.loadClass("com.test.dynamic.MyClass");
			Object object = cls.newInstance();
			Method method = cls.getMethod("doSomething", null);
			method.invoke(object, null);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}


程序运行后logcat打印出如下的信息,说明动态加载jar包成功:


下面对代码进行分析,

DexClassLoader的构造函数DexClassLoader(String dexPath,String optimizedDirectory,String libraryPath, ClassLoader parent)需要传入四个参数.第一个参数dexPath是dex文件的路径,在本例当中是dynamic.jar的路 径. optimizedDirectory是优化后的dex文件的路径,optimizedDirectory一定不能为null,官方文档上不建议把优化后的dex文件存放在外存,本例当中优化后的app_dex存放在/data/data/packagename/目录下(app_是android系统自动加的前缀). libraryPath是包含原生库的路径,可为null,本例中传的就是null。parent参数是父加载器.本例的大致流程:系统对sd卡下的dynamic.jar包进行动态加载,loadClass方法返回一个Class对象,利用java的反射机制调用MyClass当中的方法doSomething()

大家有什么问题或者意见可以和我交流~





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值