Android程序运行中动态加载Lib的方法(一)
这两天研究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中的方法了?
下一篇文章来解释一下上面的程序。
更多相关文章
- 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
- 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
- Android开发之adapter
- Android(安卓)解决bug:异常提示"ListView cannot be cast to andr
- WebRTC Android(安卓)源码编译
- 【Android(安卓)Native Code开发系列】 五 运行、调试编译的Nati
- app目录下的build.gradle详解
- Android(安卓)7.1.1 Toast引起的Crash
- 使用Titanium在Android上编写Javascript应用