问题描述
我正在尝试学习在 Android 中动态加载类 (.dex/.jar)。我从教程和堆栈溢出问题(tutorial、this 和 this)中收集了基本思想,但是我未能实现动态加载类文件并不断给出 { {1}} 个例外。
我的步骤简介:
-
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 (将#修改为@)