我在sdCard上有一个.jar文件(我使用dx工具将通常的.jar编译为dex,否则Android在运行时会出现问题)
我想要使用的类实际上是Activity,并且通过“使用”我指的是Inflate!
A)我注意到如果像这样加载类,则加载的类将具有父类的包作为其父级包(其中我运行代码的包:例如:jar库中类的真实包:“com.something”和我的应用程序包:“com.wonderfull” - >加载的类在“com.wonderfull.com.something”中:))。
B)在“最佳”情况下,我会收到此错误:
无法实例化活动ComponentInfo {com.appno2 / com.appno1.futureLib.LibActivity}: java.lang.ClassNotFoundException:dalvik.system.PathClassLoader [/ data / app / com.appno2-1.apk]中的com.appno1.futureLib.LibActivity加载器中的com.appno1.futureLib.LibActivity
C)在清单中,我已经将Activity(要动态加载的Activity)放置在以下位置:
activity android:name =“com.appno1.futureLib.LibActivity” android:label =“@string/app_name”> /活动> 所以我重复标题中的问题:是否可能从sd卡上的jar库中动态加载Activity类并实际使用它?
如果问“为什么要这样做?”-只是好奇!作为概念:用户输入有效许可证后,下载应用程序实际代码的可能性(以jar或其他形式)
更新: -此想法适用于片段(意味着要导入的类是一个片段)
当前结论: -可能将Java类甚至是Android UI相关类放在外部.jar(例如在sd卡上,或从Internet下载..etc),并在需要时动态加载它们。哦,是的:您无法以这种方式使用活动 :( ..可能甚至不会使用服务..
更多信息#1: Is it possible to dynamically load a library at runtime from an Android application? 更多信息#2: http://android-developers.blogspot.ro/2011/07/custom-class-loading-in-dalvik.html 关于URLClassLoader:这样可以工作(不涉及DalvikClassLoader-ClassNotFoundException&&显然:仍然无法像这样加载的Activity膨胀)
我想要使用的类实际上是Activity,并且通过“使用”我指的是Inflate!
A)我注意到如果像这样加载类,则加载的类将具有父类的包作为其父级包(其中我运行代码的包:例如:jar库中类的真实包:“com.something”和我的应用程序包:“com.wonderfull” - >加载的类在“com.wonderfull.com.something”中:))。
B)在“最佳”情况下,我会收到此错误:
无法实例化活动ComponentInfo {com.appno2 / com.appno1.futureLib.LibActivity}: java.lang.ClassNotFoundException:dalvik.system.PathClassLoader [/ data / app / com.appno2-1.apk]中的com.appno1.futureLib.LibActivity加载器中的com.appno1.futureLib.LibActivity
C)在清单中,我已经将Activity(要动态加载的Activity)放置在以下位置:
activity android:name =“com.appno1.futureLib.LibActivity” android:label =“@string/app_name”> /活动> 所以我重复标题中的问题:是否可能从sd卡上的jar库中动态加载Activity类并实际使用它?
如果问“为什么要这样做?”-只是好奇!作为概念:用户输入有效许可证后,下载应用程序实际代码的可能性(以jar或其他形式)
更新: -此想法适用于片段(意味着要导入的类是一个片段)
当前结论: -可能将Java类甚至是Android UI相关类放在外部.jar(例如在sd卡上,或从Internet下载..etc),并在需要时动态加载它们。哦,是的:您无法以这种方式使用活动 :( ..可能甚至不会使用服务..
更多信息#1: Is it possible to dynamically load a library at runtime from an Android application? 更多信息#2: http://android-developers.blogspot.ro/2011/07/custom-class-loading-in-dalvik.html 关于URLClassLoader:这样可以工作(不涉及DalvikClassLoader-ClassNotFoundException&&显然:仍然无法像这样加载的Activity膨胀)
File file = new File("/sdcard/myLib.jar");
File tmpDir = getDir("dex", 0);
ClassLoader loader = new URLClassLoader(new URL[]{file.toURI().toURL()}, this.getClass().getClassLoader());
DexClassLoader classloader = new DexClassLoader(file.getAbsolutePath(), tmpDir.getAbsolutePath(), null, loader);
Class<Object> classref = (Class<Object>) classloader.loadClass("packageInLib.ClassName");
Object myInstance = classref.getConstructor().newInstance();
Or instead of "loadClass"
Class<?> classref = Class.forName("packageInLib.ClassName", true, dalvikClassLoader);