Android:如何从JAR文件动态加载类?

3
我正在尝试在Android平台上动态加载一个类。该类包含在单独的库JAR文件中,但与APK一起打包(根据SDK中的新库机制)。当使用Class.forname方法时,我收到了一个类未找到的异常。我看到有些讨论围绕着DexClassLoader方法,但我找不到一个好的示例来说明它的用法(以及它是否是最好的方法 - 它似乎比forname方法更复杂!)。
如果有人能提供一个关于如何处理这个问题的代码片段示例,我将非常感激。
非常感谢您的帮助。
1个回答

4
这是一个动态加载DevicePolicyManager类的示例。
Class myClass =                                                                        
  ClassLoader.getSystemClassLoader().loadClass("android.app.admin.DevicePolicyManager")

Object DPMInstance = myClass.newInstance();                                            

Method myMethod = myClass.getMethod("setPasswordQuality",                              
                                    new Class[] { ComponentName.class,                 
                                                  int.class });                        
myMethod.invoke(DPMInstance,                                                           
                new Object[] { myComponentName,                                        
                               PASSWORD_QUALITY_NUMERIC }); 

这很有用,因为您可以选择仅在设备运行的SDK版本足够高时加载类。


谢谢Dan。然而,使用这种方法我仍然会得到ClassNotFoundException。如果类在主应用程序中而不是JAR文件中,则该类将可以正常加载,因此可能需要先扩展JAR文件以获取文件(如果代码中没有直接引用,因此未被ClassLoader加载)。 - Jon
如果JAR已经包含在您的APK中,那么我希望该类可用。但是,这个问题是否给你任何额外的提示?https://dev59.com/onVC5IYBdhLWcg3wvT_g - Dan J
假设您正在使用Eclipse,我倾向于使用Properties->Java Build Path->Projects->添加到所需项目。我不知道那与Properties->Android->Library功能有何关系(这是我猜测您正在使用的)。 - Dan J
这就是我过去两周一直在寻找的东西。非常感谢你,伙计!非常感谢你的回答! @DanJ - Arundas K V
我在这里有同样的问题。一个包含一组动态类的jar文件,除了动态加载之外没有其他引用。我认为谷歌为了不使用移动设备上的所有内存,会尝试从常见的应用程序中剔除“无用代码”。我想知道如果这些类没有被“导入”或者通过引用显式加载,那dex解析器管理器等是否能够发现。我想知道这是否是情况? - peterk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接