zoukankan      html  css  js  c++  java
  • Android 中插件的编写方法

    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     }

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

  • 相关阅读:
    IOS中多版本,多设备类型支持注意事项
    runtime
    网络搜集各种iOS开源类库
    Foudation框架常用结构体和常用类
    iOS开发-正则表达式的使用方法
    Github上的iOS资料-个人记录
    iOS应用程序多语言本地化
    星期判断
    【设定本地通知为周一到周五提醒, 周末不提醒解决办法】
    iOS9 HTTPS解决办法
  • 原文地址:https://www.cnblogs.com/cody1988/p/2973859.html
Copyright © 2011-2022 走看看