于乐乐

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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

 

posted on 2015-03-21 01:00  于乐乐  阅读(1153)  评论(0编辑  收藏  举报