最近一直在搞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;
}
}