这次尝试是根据别人的文章来完成的(参考文章在末尾),本文主要在记录这次尝试过程,直接来说下实现步骤。
1,创建测试工程,接口,实现类
- 接口
package com.jianbo.demoone.plug;
import android.content.Context;
public interface IToast {
void showToast(Context context,String message);
}
- 实现类
package com.jianbo.demoone.plug;
import android.content.Context;
import android.widget.Toast;
public class ToastImpl implements IToast {
@Override
public void showToast(Context context, String message) {
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
}
}
2,在app的build.gradle创建task,将ToastImpl导出为Jar包,删除项目ToastImpl类
- task,在studio 命令窗口输入gradlew makeJar,生成Jar位置(app/build/libs/origin.jar)
task makeJar(type: org.gradle.api.tasks.bundling.Jar) {
//删除存在的
delete 'com/jianbo/demoone/plug/origin.jar'
//指定生成的Jar名
baseName 'origin'
//设置拷贝的文件
from('build/intermediates/classes/debug/com/jianbo/demoone/plug/ToastImpl.class')
//打进jar包后的文件目录
into('com/jianbo/demoone/plug/')
}
3,通过sdk中dx的命令,得到内含class.dex的output.jar
在命令行下进入 SDK下的build-tools\21.0.2下(dx所在位置),执行dx –dex –output=output.jar origin.jar
4,测试,把得到的output.jar 放到手机sd卡跟目录下(sdcard/output.jar)
5,写java代码测试
// dexOutputDir解压后的dex存放位置,此位置一定要是可读写且仅该应用可读写(安全性考虑),
// 所以只能放在data/data下。本文getDir("dex1", 0)会在/data/data/**package/下创建一个名叫”app_dex1“的文件夹
// ,其内存放的文件是自动生成output.dex;如果不满足条件
File dexOutputDir = getDir("dex1", 0);
String dexPath = Environment.getExternalStorageDirectory().toString() + File.separator + "output.jar";
DexClassLoader loader = new DexClassLoader(dexPath,
dexOutputDir.getAbsolutePath(),
null, getClassLoader());
try {
Class clz = loader.loadClass("com.jianbo.demoone.plug.ToastImpl");
IToast impl = (IToast) clz.newInstance();
impl.showToast(MainActivity.this,"我是一个外部的实例");
} catch (Exception e) {
}
6,添加相应的文件权限,调用后会显示 “我是一个外部的实例”的Toast。
本文是完全参考 http://blog.csdn.net/u013478336/article/details/50734108 实现的。
有具体的细节疑问,请移步。