Android动态加载jar包

前言:

云端架构提出一个边缘计算的的概念,就是云端提供一个或者多个动态的jar包,里面包含了一些计算方法,需要Android动态的去加载jar包,获取其中的方法。

其中包含了2个难点:
1:如何把一个普通的jar包改为Android可以识别的jar包。
2:DexClassLoader类实现Jar的动态加载并通过反射去获取jar包的方法。
下面我们就说明一下。

1:如何把一个普通的jar包改为Android可以识别的jar包

其实很简单,使用Android SDK提供的工具(在build-tools目录下,随便一个版本),有些版本的没有,可以网上下载。利用dx工具,将java的jar包转为Android虚拟机可以认识的字节码,具体来说,就是在此文件夹下执行如下的命令:
dx --dex --output=dex.jar Hello.jar
其中,Hello.jar是我们的原jar包,dex.jar是我们用dx工具处理后的jar包,是Android虚拟机可以识别的jar文件(注意JDK版本一定要在9之下,否则会报错),接下来就可以进行第二步操作了,这里,我们需要使用DexClassLoader类实现Jar的动态加载。

2: DexClassLoader加载Jar的动态加载
1.  public String getAlgorithm(String className, String methodName) {  
2.       File directory = FileUtil.getInternalCacheDirectory(APPConstant.JAR_DIR);  
3.       File fP = new File(directory.getAbsolutePath());  
4.       for (File file : fP.listFiles()) {  
5.           Context context = BaseApplication.getContext();  
6.           File optimizedDexOutputPath = context.getDir("temp", Context.MODE_PRIVATE);  
7.           String filePath = file.getAbsolutePath();  
8.           String optimizedPath = optimizedDexOutputPath.getAbsolutePath();  
9.           DexClassLoader classLoader = new DexClassLoader(filePath, optimizedPath, null, context.getClassLoader());  
10.          try {  
11.              Class iClass = classLoader.loadClass(className);  
12.              Constructor localConstructor = iClass.getConstructor(new Class[]{});  
13.              Object obj = localConstructor.newInstance(new Object[]{});  
14.              Method method = iClass.getDeclaredMethod(methodName, new Class[0]);  
15.              method.setAccessible(true);  
16.              String name = (String) method.invoke(obj);  
17.              Log.w(TAG, "name:" + name);  
18.              return name;  
19.          } catch (Exception e) {  
20.              Log.e(TAG, "解析jar包失败:" + e.getMessage());  
21.          }  
22.      }  
23.      return "";  
24.  } 

获取jar包所在文件夹里的所有jar包遍历,通过DexClassLoader 加载所有jar包,再通过反射技术根据类名和方法名去调用对应的方法,这样就完成了jar包的动态调用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容