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

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

首先上一个实例:

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

简单翻译一下:

第一步:

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

packageorg.shlublu.android.sandbox;

importandroid.util.Log;

publicclassMyClass{

publicMyClass(){

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

}

publicvoiddoSomething(){

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

}

}

第二步:

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

第三步:

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

在里面添加这样一个activity:

publicclassMainextendsActivity

{@SuppressWarnings("unchecked")

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

try{

finalStringlibPath=Environment.getExternalStorageDirectory()+"/shlublu.jar";

finalFiletmpDir=getDir("dex",0);

finalDexClassLoaderclassloader=newDexClassLoader(libPath,tmpDir.getAbsolutePath(),null,this.getClass().getClassLoader());

finalClassclassToLoad=(Class)classloader.loadClass("org.shlublu.android.sandbox.MyClass");

finalObjectmyInstance=classToLoad.newInstance();

finalMethoddoSomething=classToLoad.getMethod("doSomething");

doSomething.invoke(myInstance);

}catch(Exceptione){

e.printStackTrace();

}

}

}

第四步:

跑起来,进入上面的Main

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的远程下载加载动态链接库的示例代码,包括下载器部分。请注意,这只是一个示例代码,仅供参考。 下载器部分: ```java public class Downloader { public static void download(String url, String localPath) throws Exception { URLConnection connection = new URL(url).openConnection(); int contentLength = connection.getContentLength(); InputStream input = new BufferedInputStream(connection.getInputStream()); OutputStream output = new FileOutputStream(localPath); byte[] data = new byte[1024]; int count; int progress = 0; while ((count = input.read(data)) != -1) { output.write(data, 0, count); progress += count; System.out.println("Downloaded " + progress + "/" + contentLength + " bytes"); } output.flush(); output.close(); input.close(); } } ``` 加载动态链接库部分: ```java public class NativeLibraryLoader { private static final String LIB_NAME = "mylibrary"; private static final String LIB_URL = "https://example.com/mylibrary.so"; static { try { File tempDir = new File(System.getProperty("java.io.tmpdir")); File libFile = new File(tempDir, LIB_NAME); if (!libFile.exists()) { System.out.println("Downloading library..."); Downloader.download(LIB_URL, libFile.getAbsolutePath()); } System.load(libFile.getAbsolutePath()); } catch (Exception e) { e.printStackTrace(); } } public static native void myNativeMethod(); } ``` 在这个示例,我们首先定义了要下载动态链接库的名称和远程URL。在加载本地库之前,我们检查本地目录是否已经有了这个库,如果没有,就使用`Downloader`类从远程URL下载它。然后我们使用`System.load()`方法加载本地库。 请注意,为了使本地库能够正确加载,你需要确保它与Android设备的CPU架构相匹配。例如,如果你的设备使用ARM架构,则需要下载加载ARM版本的库。 当然,还有很多其他的细节需要考虑,例如错误处理、下载进度更新、库的存储位置等等,但这个示例应该可以为你提供一个大致的思路。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值