博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 中插件的编写方法
阅读量:5791 次
发布时间:2019-06-18

本文共 2377 字,大约阅读时间需要 7 分钟。

 

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 }

 

 为什么没办法把项目链接放进来了呢?

 

 

 

 

 

转载于:https://www.cnblogs.com/cody1988/archive/2013/03/21/2973859.html

你可能感兴趣的文章
程序员常用的六大技术博客类
查看>>
Iceworks 2.8.0 发布,自定义你的 React 模板
查看>>
胖哥学SpringMVC:请求方式转换过滤器配置
查看>>
Kotlin 更加优雅的 Builder - 理解 with
查看>>
前端日拱一卒D6——字符编码与浏览器解析
查看>>
深入理解浏览器的缓存机制
查看>>
微软向Linux社区开放60000多项专利:对开源微软是认真的
查看>>
Hoshin Kanri在丰田的应用
查看>>
又拍云沈志华:如何打造一款安全的App
查看>>
克服大数据集群的挑战
查看>>
PostgreSQL并发控制(MVCC, 事务,事务隔离级别)
查看>>
DM***的第二阶段OSPF
查看>>
20180702搭建青岛RAC记录
查看>>
Spring Security OAuth 实现OAuth 2.0 授权
查看>>
linux文件及简单命令学习
查看>>
dubbo源码分析-架构
查看>>
新 Terraform 提供商: Oracle OCI, Brightbox, RightScale
查看>>
6套毕业设计PPT模板拯救你的毕业答辩
查看>>
IT兄弟连 JavaWeb教程 JSP与Servlet的联系
查看>>
Windows phone 8 学习笔记
查看>>