zoukankan      html  css  js  c++  java
  • Android 动态类加载

    Android程序可以通过动态类加载方法,在运行时动态生成对象,调用方法。

    在Android中可以动态加载,但无法像Java中那样方便动态加载jar. 

    原因:Android的虚拟机(Dalvik VM)是不认识Java打出jar的byte code,需要通过dx工具来优化转换成Dalvik byte code才行。

    1. 首先生成被调用的dex文件:

    package com.dynamic;

    public interface IDynamic {
      public String helloworld();
    }

    package com.dynamic;

    public class IDynamicTest implements IDynamic{
      public String helloworld()
      {
        return "hello world";
      }
    }

    构造helloworld函数,将代码Export打包成1.jar文件,调用Android自带的dx工具,将1.jar文件编译成包含dex文件的test.jar。

    2. 在Android代码中,调用test.jar中的helloworld函数。

    public void onClick(View v) {

      button1.setText("LauClass(M1)");

      final File dexpathFile = new File("/data/app/test.jar");                                  // 指定jar文件位置

      DexClassLoader classLoader = new DexClassLoader(dexpathFile.getAbsolutePath(), "/data/app/", null, getClassLoader());   //生成classLoader

      try{

        Class libProvideClass = classLoader.loadClass("com.dynamic.IDynamicTest");                     //利用ClassLoader将类加载进来

        if (libProvideClass==null)

        {

          return ;

        }

        Object obj=libProvideClass.newInstance();                                     //利用得到的类生成实例对象

        Method methodInstance = libProvideClass.getMethod("helloworld", null);                        //获取对象的方法对象

        if(methodInstance==null)

        {

          finish();

        }

        Toast.makeText(secondClass.this, (String)methodInstance.invoke(obj,null), Toast.LENGTH_SHORT).show();        //触发helloworld方法

      } catch(Exception exception)

      {

        exception.printStackTrace();

      }

    }

    Related URL:

    http://my.oschina.net/Jerryking/blog/111575

    http://www.cnblogs.com/over140/archive/2011/11/23/2259367.html

  • 相关阅读:
    C# DataTable 导出到 Excel 的两种方法
    C# Unicode编码解码
    msbuild不是内部或外部命令
    发布web项目时,关于未能加载文件或程序集或它的某一个依赖项。拒绝访问的问题
    hithub中文排行榜
    【MAC工具】手机抓包工具之 —— whistle
    vueApp打包
    TortoiseSVN设置Beyond Compare为版本比较、差异合并工具
    微信公众号开发
    DataTable转List,DataTable转为Model对象帮助类
  • 原文地址:https://www.cnblogs.com/yulele/p/4355037.html
Copyright © 2011-2022 走看看