首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android:当加载接口时,DexClassLoader类加载失败

Android:当加载接口时,DexClassLoader类加载失败
EN

Stack Overflow用户
提问于 2016-06-29 13:33:18
回答 1查看 3.4K关注 0票数 3

简介:,我试图在运行时从classes.jar内部的classes.dex加载代码。我做了很多研究,花了很多时间在这个问题上,所以我真的需要帮助。

问题:当我的jar包含一个简单的类时,就成功地加载了它。但是,在完全相同的情况下,当我的jar包含相同的类时,只有在该类实现接口之后,加载该类才会出现错误:

在path上没有找到类"com.x.y.z.w.Patch“:DexPathList[zip文件DexPathList nativeLibraryDirectories=/供应商/lib64 64,/system/lib64 64]”

我还得到:

I/dalvikvm:未能解决Lcom/x/y/TestClassImpl;接口4 'Lcom/x/y/TestClassInterface;‘

Environment: -用于尝试加载类的函数:

(DexClassLoader实例).loadClass& (DexFile实例).loadClass。

具体地说:

方法1:

代码语言:javascript
复制
DexFile dx = DexFile.loadDex(jarInternalPath, File.createTempFile("opt", "dex", 
    context.getCacheDir()).getPath(), 0);
Class<?> targetClass = dx.loadClass(className, 
    ClassLoader.getSystemClassLoader()); // Error

方法2:

代码语言:javascript
复制
DexClassLoader dexClassLoader = new DexClassLoader(jarInternalPath,
    dexOutPath.getAbsolutePath(), null, ClassLoader.getSystemClassLoader());
Class<?> targetClass = dexClassLoader.loadClass(className); // Error
  • IDE: Android 2.1.2
  • 测试设备:模拟器Nexus 4(带有API 16、19和23),以及带有Android 6.0.1的物理Nexus 5设备
  • 最令人惊讶的事情是:当我打印dex文件的类时,我会看到正确的类路径。我使用DexFile加载dex内容并打印其类路径。--这个方法识别正确的内容!--它让我觉得这与Android权限或Linux权限有关。我不知道..

这是我的打印方法:

代码语言:javascript
复制
try {
    DexFile dx = DexFile.loadDex(jarInternalPath, File.createTempFile("opt", "dex",
        context.getCacheDir()).getPath(), 0);

    // Print all classes in the DexFile
    for (Enumeration<String> classNames = dx.entries(); classNames.hasMoreElements();) {
        String className = classNames.nextElement();
        Log.d(TAG, "Analyzing dex content, fonud class: " + className);
    }
} catch (IOException e) {
    Log.d(TAG, "Error opening " + jarInternalPath, e);
}
  • P.S.似乎无关紧要,但可能不是: My Host、公共接口和新内容的实现都位于同一个项目的3个不同模块中。该应用程序的包名为x.y.z,接口为pkgName of x.y.z.interface,实现为pkgName of x.y.z.impl。

第二个项目,我尝试了与所有3个模块相同,1个模块未能以同样的方式工作。

求你了救命!

EN

回答 1

Stack Overflow用户

发布于 2016-07-15 22:16:14

这还不足以负担你的课程。必须更改系统类加载器,以便从dex动态和编程地使用您自己的类。否则,您就不能使用您的接口或类或其他任何东西。

如果您希望动态加载类,那么首先从dexfile或dexclass加载器加载类,然后使用它。

例如,

代码语言:javascript
复制
Class<?> myOwnClass = MyDexClassLoader.loadClass("com.example.my");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38101183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档