在 Android 中动态加载 .dex 文件时出现“ClassNotFound”异常

问题描述

我正在尝试学习在 Android 中动态加载类 (.dex/.jar)。我从教程和堆栈溢出问题(tutorialthisthis)中收集了基本思想,但是我未能实现动态加载类文件并不断给出 { {1}} 个例外。

我的步骤简介:

  1. 按照文章中的说明创建了一个 Java 文件

    ClassNotFound
  2. 将 java 源代码转换为 .class(结果 = Dynamicclass.class)

     public class Dynamicclass {
         public static void main(String[] args){
             print();
         }
    
         public static void print() {
             System.out.println("Hello Dynamic");
         }
     }
    
  3. 使用 Android SDK 中的 javac Dynamicclass.java 工具创建了 jar 文件。 (result = dynamic.jar,里面有classes.dex)

    dx

    获得 .jar 文件后,我将其推送到 /sdcard/(在模拟器和设备上都进行了测试)

    模拟器:Android 6.0 和 设备:Android 11.0

    加载类的简要代码

     dx --dex --output=dynamic.jar Dynamicclass.class
    

我不断收到 try { String dexPath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "dynamic.jar"; Log.d("DYNAMIC_TEST","dexPath: "+dexPath); final File tmpDir = getDir("dex",0); // temporary file creation for .exists() check File dexFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "dynamic.jar"); if (dexFile.exists()){ // dexFile location is same as dexPath location Log.d("DYNAMIC_TEST","File Found"); DexClassLoader dexClassLoader = new DexClassLoader(dexPath,tmpDir.getAbsolutePath(),null,this.getClass().getClassLoader()); Class dynamicclass = dexClassLoader.loadClass("Dynamicclass"); Method printMethod = dynamicclass.getmethod("print"); printMethod.invoke(dynamicclass.newInstance()); Log.d("DYNAMIC_TEST","Success"); } else { Log.d("DYNAMIC_TEST","File NOT Found"); } }catch (Exception e){ Log.d("DYNAMIC_TEST","Exception: "+ e.toString()); } 异常。

我错过了什么?为什么无法加载这个简单的类文件:(?

我的清单:

  1. 确保代码能够获取加载的文件 (.exists())。代码能够获取文件。只是无法加载类。
  2. 确保 dynamic.jar 中包含一个 classes.dex 条目。 (这是因为 DexClassLoader 想要一个 .jar/.apk 文件,其中包含 classes.dex 条目)
  3. 尝试在模拟器和设备(都具有不同的 Android 版本)上运行代码

异常描述:

异常:java.lang.classNotFoundException:在路径上没有找到类“Dynamicclass”:DexPathList[[zip file "/storage/emulated/0/dynamic.jar"],nativeLibraryDirectories=[/system/lib64,/供应商/lib64]]

包含包后的异常。

异常:java.lang.classNotFoundException:在路径上没有找到类“mypack.Dynamicclass”:DexPathList[[zip file “/storage/emulated/0/mypack.jar”],/vendor/lib64]]

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)