前言:
云端架构提出一个边缘计算的的概念,就是云端提供一个或者多个动态的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包的动态调用。
网友评论