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包了。
![](http://images.cnitblog.com/blog/296252/201303/21170402-9a0fca1244e4434d867f11084afe21f5.png)
在项目中加载插件并且调用方法 (代码附件中都有)
如果想调用jar中的方法,可以有两种方法
1.通过反射获得Method,然后Invoke
2.通过接口的方法,但是这里要特别注意,导出为jar包时候,不可以导出接口,并且在Android项目中必须有一个在同样包中的接口。
具体的情况附件中的com.cody.andplugin.plugin.IPluginCallback接口,这个接口在java项目和Android项目中都有,但是导出的时候,
必须去掉。
![](http://images.cnitblog.com/blog/296252/201303/21171258-28ff2ff3f4364ed0b7a2e4bff04e9b8c.png)
调用的主要代码如下
为什么没办法把项目链接放进来了呢?
所以有两点要注意
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包了。
![](http://images.cnitblog.com/blog/296252/201303/21170402-9a0fca1244e4434d867f11084afe21f5.png)
在项目中加载插件并且调用方法 (代码附件中都有)
如果想调用jar中的方法,可以有两种方法
1.通过反射获得Method,然后Invoke
2.通过接口的方法,但是这里要特别注意,导出为jar包时候,不可以导出接口,并且在Android项目中必须有一个在同样包中的接口。
具体的情况附件中的com.cody.andplugin.plugin.IPluginCallback接口,这个接口在java项目和Android项目中都有,但是导出的时候,
必须去掉。
![](http://images.cnitblog.com/blog/296252/201303/21171258-28ff2ff3f4364ed0b7a2e4bff04e9b8c.png)
调用的主要代码如下
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 }
为什么没办法把项目链接放进来了呢?
相关文章推荐
- Android 中插件的编写方法
- 详解Android的OkHttp包编写异步HTTP请求调用的方法
- 另一种WinDbg插件编写方法-Debugger Engine Extension
- 举例说明jquery插件的编写方法
- [Android开发] Xposed 插件开发之三: 编写广告去除插件
- 另一种 WinDbg 插件编写方法 - Debugger Engine Extension
- 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口(老罗学习笔记4)
- Android Cordova 插件开发之编写自定义插件
- android之eclipse简易快速安装插件方法
- android 傻瓜式 MultiDex 插件,从此再也不用担心方法数问题!
- Android的Service基本编写方法
- 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口
- android 编写Service(四大组件之一)的方法
- 使用vue-cli编写vue插件的方法
- 详解Android中App的启动界面Splash的编写方法
- 3.腾讯微博Android客户端开发——算法、编码、辅助方法编写
- 初步编写IDEA\AndroidStudio翻译插件
- 3.腾讯微博Android客户端开发——算法、编码、辅助方法编写 .
- 再谈:jquery编写插件的方法
- 编写android程序调用jni本地方法的实现(详细例子)