您的位置:首页 > 移动开发 > Android开发

Android 中插件的编写方法

2013-04-21 20:17 274 查看
java中插件主要使用反射机制来完成,Android与Java中一样也是通过反射机制,不同的是Android中使用的是DexClassLoader和PathClassLoader。 原因很简单,Android中使用的是Dalvik虚拟机,而Dalvik不认识java 的jar中的byte code,它认识使用android platform tools中dx命令优化过的 byte code。
所以有两点要注意
1. 要使用DexClassLoader加载没有通过apk方式安装在android系统中的java类,通过PathClassLoader加载安装的apk中的java类
2. 加载的类要是apk中的或者是dx命令优化过的。

下面举个例子:
1. 导出jar包(可以通过eclipse导出 右击项目->export->java jar->......)
2. 将jar包使用dx命令优化。命令如下(如果没有配置好dx的path路径,请自觉在dos中切换到dx的目录,我的是在D:\dev_software\android_sdk\platform-tools目录)
dx --dex --output=des src (des 为转换后的完整路径,src为要转换的文件的完整路径) 这样就可以得到一个可以作为android的插件的jar包了。




在项目中加载插件并且调用方法 (代码附件中都有)
如果想调用jar中的方法,可以有两种方法
1.通过反射获得Method,然后Invoke
2.通过接口的方法,但是这里要特别注意,导出为jar包时候,不可以导出接口,并且在Android项目中必须有一个在同样包中的接口。
具体的情况附件中的com.cody.andplugin.plugin.IPluginCallback接口,这个接口在java项目和Android项目中都有,但是导出的时候,
必须去掉。






调用的主要代码如下
1 public void onClick(){
 2         
 3         String sdcardPath = Environment.getExternalStorageDirectory().getAbsolutePath();
 4 //        String dexPath = sdcardPath + File.separator + "plugin-test-and.jar";
 5         String dexPath = sdcardPath + File.separator + "plugin.jar";
 6         System.out.println(new File(dexPath).exists());
 7         String optimizedDirectory = sdcardPath;
 8         DexClassLoader dexClassLoader = new DexClassLoader(dexPath, optimizedDirectory, null, getClassLoader());
 9         
10         try {
11             Class PluginTest = dexClassLoader.loadClass("com.cody.andplugin.plugin.PluginTest");
12             //获取对象
13             Object object0 = PluginTest.newInstance();
14             System.out.println(object0.getClass().getName());
15             //通过反射获得方法
16             Method sayHello = PluginTest.getMethod("sayHello", new Class[]{});
17             sayHello.invoke(object0, new Object[]{});
18             Method work = PluginTest.getMethod("work", new Class[]{int.class});
19             work.invoke(object0, new Object[]{24});
20             
21             Class clazz = dexClassLoader.loadClass("com.cody.andplugin.plugin.PluginCallback");
22             //获取对象
23             Object object = clazz.newInstance();
24             IPluginCallback cb = (IPluginCallback) object;
25             cb.callback();
26             
27         } catch (Exception e) {
28             e.printStackTrace();
29         }
30         
31         
32     }

为什么没办法把项目链接放进来了呢?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: