如何解决在 Android 中动态加载 .dex 文件时出现“ClassNotFound”异常
我正在尝试学习在 Android 中动态加载类 (.dex/.jar)。我从教程和堆栈溢出问题(tutorial、this 和 this)中收集了基本思想,但是我未能实现动态加载类文件并不断给出 { {1}} 个例外。
我的步骤简介:
-
按照文章中的说明创建了一个 Java 文件。
ClassNotFound
-
将 java 源代码转换为 .class(结果 = DynamicClass.class)
public class DynamicClass { public static void main(String[] args){ print(); } public static void print() { System.out.println("Hello Dynamic"); } }
-
使用 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());
}
异常。
我错过了什么?为什么无法加载这个简单的类文件:(?
我的清单:
- 确保代码能够获取加载的文件 (
.exists())。代码能够获取文件。只是无法加载类。 - 确保 dynamic.jar 中包含一个 classes.dex 条目。 (这是因为 DexClassLoader 想要一个 .jar/.apk 文件,其中包含 classes.dex 条目)
- 尝试在模拟器和设备(都具有不同的 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 举报,一经查实,本站将立刻删除。