Android 中插件的编写方法
来源:互联网 发布:ubuntu路径设置 编辑:程序博客网 时间:2024/06/12 01:03
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 }
为什么没办法把项目链接放进来了呢?
<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
- Android 中插件的编写方法
- jQuery插件的编写方法
- jQuery插件的编写方法
- 编写Ogre插件的一般方法
- 举例说明jquery插件的编写方法
- android平台中编写jni模块的方法(1)
- jq插件的编写方法(自定义jq插件)
- jquery插件编写方法
- JQuery插件编写方法
- chrome插件编写中需要了解的几个概念和一些方法
- chrome插件编写中需要了解的几个概念和一些方法
- 基于android的主题插件编写
- 在VS2008中编写魔兽世界的插件
- servlet中方法的编写
- android 环境中adt插件的更新方法
- 编写Android Studio插件
- Android Gradle 插件编写
- 编写QQ外挂插件的原理和方法(转)
- 为雅安祈福css 网页黑白特效
- Android中定时器的3种实现方法
- java开发线程篇2:sleep() 和 wait() 有什么区别? (做线程的必知!)
- 输入年月日,算出那天是当年的第几天
- Python的类
- Android 中插件的编写方法
- 黑马程序员 08 Java基础教学 - 08 - 面向对象(4) 之 多态
- linux系统中各个文件描述——陆续添加
- caret包函数不完全解析
- 函数指针 Function Pointer
- 简单端口扫描linux port scanner
- Java有没有goto?
- 【Andorid X 项目笔记】开源项目使用(6)
- 第二部分 Linux Shell高级编程技巧——第三章 运行级别脚本介绍