美文网首页
Android动态加载jar包

Android动态加载jar包

作者: 海内灬存知己 | 来源:发表于2022-12-13 11:00 被阅读0次
    前言:

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

    相关文章

      网友评论

          本文标题:Android动态加载jar包

          本文链接:https://www.haomeiwen.com/subject/yhjhqdtx.html