Android程序运行中动态加载Lib的方法(一)

本文分享了Android应用程序在运行时动态加载库的步骤。首先创建一个包含特定类的Android项目并导出为APK或JAR。然后,在另一个项目中使用DexClassLoader加载外部JAR中的类并执行其方法。成功运行后,可在Log中看到动态加载类的输出。下篇将深入解析相关程序的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这两天研究android的动态加载,下面把心得和大家分享一下吧!


首先上一个实例:


这个是stackOverFlow上面的一个帖子,被采纳的答案解决了这个问题:


http://stackoverflow.com/questions/6857807/is-it-possible-to-dynamically-load-a-library-at-runtime-from-an-android-applicat


简单翻译一下:


第一步:

建一个普通的android项目,里面添加一个类:


package org.shlublu.android.sandbox;

import android.util.Log;

publicclassMyClass{

   publicMyClass(){

       Log.d(MyClass.class.getName(),"MyClass: constructor called.");

   }

   public void doSomething(){

       Log.d(MyClass.class.getName(),"MyClass: doSomething() called.");

   }

}



第二步:

把这个android项目导出为apk (当然也可以打成jar包,如果打成jar包,那么jar包里面必须包含classes.dex,这个classes.dex里面包含了上面的MyClass类)


第三步:

新建一个android项目(或者用刚刚那个也行)

在里面添加这样一个activity:


public class Main extends Activity

{@SuppressWarnings("unchecked")

@Override

protected void onCreate(Bundle savedInstanceState){

       super.onCreate(savedInstanceState);

       setContentView(R.layout.main);

       try{

           final String libPath =Environment.getExternalStorageDirectory()+"/shlublu.jar";

           final File tmpDir = getDir("dex",0);

           final DexClassLoader classloader =newDexClassLoader(libPath, tmpDir.getAbsolutePath(),null,this.getClass().getClassLoader());

           final Class<Object> classToLoad =(Class<Object>) classloader.loadClass("org.shlublu.android.sandbox.MyClass");

           final Object myInstance  = classToLoad.newInstance();

           final Method doSomething = classToLoad.getMethod("doSomething");

           doSomething.invoke(myInstance);

       }catch(Exception e){

           e.printStackTrace();

       }

   }

}


第四步:

跑起来,进入上面的Main

查看Log看结果,是不是发现log里面已经有了我们刚刚第一步添加的MyClass中的方法了?


下一篇文章来解释一下上面的程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值