我正在尝试学习在 Android 中动态加载类(.dex/.jar)。我从教程和 Stack Overflow 问题中收集了基本想法 (tutorial, this, and this),但我未能实现动态加载类文件并不断给出的目的ClassNotFound
例外。
我的步骤简述:
-
创建了文章中给出的 Java 文件。
public class DynamicClass {
public static void main(String[] args){
print();
}
public static void print() {
System.out.println("Hello Dynamic");
}
}
-
将 java 源代码转换为 .class(结果 = DynamicClass.class)
javac DynamicClass.java
-
使用创建的jar文件dx
Android SDK 中的工具。 (结果=包含classes.dex的dynamic.jar)
dx --dex --output=dynamic.jar DynamicClass.class
获得 .jar 文件后,我将其推送到 /sdcard/ (在模拟器和设备上都进行了测试)
模拟器:Android 6.0 和
设备:安卓11.0
加载类的简要代码:
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());
}
我不断地得到ClassNotFound
例外。
我缺少什么?为什么无法加载这个简单的类文件:(?
我的清单:
- 确保代码能够获取加载的文件(.exists())。代码能够获取该文件。只是无法加载类。
- 确信动态jar包含一个类.dex进入其中。 (这是因为Dex类加载器想要一个.jar/.apk文件与类.dex进入其中)
- 尝试在模拟器和设备上运行代码(两者都有不同的 Android 版本)。
异常描述:
异常:java.lang.ClassNotFoundException:在路径上找不到类“DynamicClass”:DexPathList[[zip文件“/storage/emulated/0/dynamic.jar”],nativeLibraryDirectories=[/system/lib64,/vendor/lib64 ]]
包含包后出现异常。
异常:java.lang.ClassNotFoundException:在路径上找不到类“mypack.DynamicClass”:DexPathList[[zip文件“/storage/emulated/0/mypack.jar”],nativeLibraryDirectories=[/system/lib64,/vendor /lib64]]
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)