本文引用自http://www.cnblogs.com/over140/archive/2011/11/23/2259367.html
1.android动态加载jar包
a.新建java工程
创建接口:
package com.example.testload;
public interface IDynamic {
public String helloWorld();
}
创建一个类实现该接口:
package com.test.jarload;
public class DynamicTest implements IDynamic {
@Override
public String helloWorld() {
return "Hello World!";
}
}
然后将该java工程导出到jar文件,这里我导出的是load.jar注意:
导出jar文件的时候,不要勾选接口选项
因为在android工程中,是不能直接运行jar文件的,所以我们需要利用android提供的dx来进行转换:
进入sdk的目录,找到dx文件,注意大部分sdk的dx文件是在platform-tools文件夹下,也有一些是在build-tools文件夹下,总之进入包含有dx文件的文件夹中,将我们之前导出的jar文件load.jar拷贝到给目录中,然后用命令行进入该目录,执行dx --dex --output=test.jar load.jar 会发现在该目录下生成了一个test.jar文件,这个文件就是android工程可以加载的文件,将该文件拷贝到sdcard的根目录中。
新建一个android工程:
代码比较简单,如下:
首先需要将之前的接口在该工程中在声明一遍:
public interface IDynamic {
public String helloWorld();
}
MainActivity的代码比较简单,直接贴代码了:
mToastButton = (Button) findViewById(R.id.toast_button);
mToastButton.setOnClickListener(new View.OnClickListener() {
@SuppressLint("NewApi")
public void onClick(View view) {
final File optimizedDexOutputPath = new File(Environment.getExternalStorageDirectory().toString()
+ File.separator + "test.jar");
String path = optimizedDexOutputPath.getAbsolutePath();
DexClassLoader cl = new DexClassLoader(optimizedDexOutputPath.getAbsolutePath(),
Environment.getExternalStorageDirectory().toString(), null, getClassLoader());
Class libProviderClazz = null;
try {
libProviderClazz = cl.loadClass("com.test.jarload.DynamicTest");
IDynamic lib = (IDynamic)libProviderClazz.newInstance();
Toast.makeText(MainActivity.this, lib.helloWorld(), Toast.LENGTH_SHORT).show();
} catch (Exception exception) {
exception.printStackTrace();
}
}
});
下面看看android中动态加载未安装的apk文件:
首先新建一个android工程,创建一个activity如下:
public class TestBActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public String getMoney() {
return "1";
}
}
然后将该android工程打包成apk文件(test.apk),拷贝到sdcard的根目录中:
然后新建另外一个android工程用来加载之前导出的apk文件:
主要代码如下:
String path = Environment.getExternalStorageDirectory() + "/";
String filename = "test.apk";
DexClassLoader classLoader = new DexClassLoader(path + filename, path,
null, getClassLoader());
try {
Class mLoadClass = classLoader.loadClass("com.nmbb.TestBActivity");
Constructor constructor = mLoadClass.getConstructor(new Class[] {});
Object TestBActivity = constructor.newInstance(new Object[] {});
Method getMoney = mLoadClass.getMethod("getMoney", null);
getMoney.setAccessible(true);
Object money = getMoney.invoke(TestBActivity, null);
Toast.makeText(this, money.toString(), Toast.LENGTH_LONG).show();
} catch (Exception e) {
e.printStackTrace();
}
注意:以上不管是动态运行jar文件还是apk文件,都需要添加sdcard的读取权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>