android动态加载

本文引用自http://www.cnblogs.com/over140/archive/2011/11/23/2259367.html


1.android动态加载jar包

    a.新建java工程

        创建接口:

package com.example.testload;

public interface IDynamic {
    public String helloWorld();
}
       创建一个类实现该接口:

package com.test.jarload;

public class DynamicTest implements IDynamic {

    @Override
    public String helloWorld() {
        return "Hello World!";
    }
}
然后将该java工程导出到jar文件,这里我导出的是load.jar注意: 导出jar文件的时候,不要勾选接口选项
 

     因为在android工程中,是不能直接运行jar文件的,所以我们需要利用android提供的dx来进行转换: 

     进入sdk的目录,找到dx文件,注意大部分sdk的dx文件是在platform-tools文件夹下,也有一些是在build-tools文件夹下,总之进入包含有dx文件的文件夹中,将我们之前导出的jar文件load.jar拷贝到给目录中,然后用命令行进入该目录,执行dx --dex --output=test.jar load.jar 会发现在该目录下生成了一个test.jar文件,这个文件就是android工程可以加载的文件,将该文件拷贝到sdcard的根目录中。

   

    新建一个android工程:

    代码比较简单,如下:

    首先需要将之前的接口在该工程中在声明一遍:

    

public interface IDynamic {
    public String helloWorld();
}
    MainActivity的代码比较简单,直接贴代码了:

 

 mToastButton = (Button) findViewById(R.id.toast_button);
        
        mToastButton.setOnClickListener(new View.OnClickListener() {
            @SuppressLint("NewApi")
			public void onClick(View view) {
                final File optimizedDexOutputPath = new File(Environment.getExternalStorageDirectory().toString()
                    + File.separator + "test.jar");
                String path = optimizedDexOutputPath.getAbsolutePath();
                DexClassLoader cl = new DexClassLoader(optimizedDexOutputPath.getAbsolutePath(),
                    Environment.getExternalStorageDirectory().toString(), null, getClassLoader());
                Class libProviderClazz = null;
                
                try {
                    libProviderClazz = cl.loadClass("com.test.jarload.DynamicTest");
                    
                    IDynamic lib = (IDynamic)libProviderClazz.newInstance();
                    
                    Toast.makeText(MainActivity.this, lib.helloWorld(), Toast.LENGTH_SHORT).show();
                } catch (Exception exception) {
                    exception.printStackTrace();
                }
            }
        });



下面看看android中动态加载未安装的apk文件:

    首先新建一个android工程,创建一个activity如下:

public class TestBActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    public String getMoney() {
        return "1";
    }

}

然后将该android工程打包成apk文件(test.apk),拷贝到sdcard的根目录中:

     然后新建另外一个android工程用来加载之前导出的apk文件:

    主要代码如下:

        String path = Environment.getExternalStorageDirectory() + "/";
        String filename = "test.apk";
        DexClassLoader classLoader = new DexClassLoader(path + filename, path,
                null, getClassLoader());

        try {
            Class mLoadClass = classLoader.loadClass("com.nmbb.TestBActivity");
            Constructor constructor = mLoadClass.getConstructor(new Class[] {});
            Object TestBActivity = constructor.newInstance(new Object[] {});
            
            Method getMoney = mLoadClass.getMethod("getMoney", null);
            getMoney.setAccessible(true);
            Object money = getMoney.invoke(TestBActivity, null);
            Toast.makeText(this, money.toString(), Toast.LENGTH_LONG).show();
            
        } catch (Exception e) {
            e.printStackTrace();
        }

      注意:以上不管是动态运行jar文件还是apk文件,都需要添加sdcard的读取权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>








  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值