Android 低版本 InMemoryDexClassLoader 无法加载 SO 库的解决方案
是的,可以自定义一个 DexClassLoader 类,在其内部持有一个 InMemoryDexClassLoader 对象,以弥补不能读取 so 的缺陷。\n\n示例代码如下:\n\njava\npublic class CustomDexClassLoader extends DexClassLoader {\n private InMemoryDexClassLoader inMemoryDexClassLoader;\n\n public CustomDexClassLoader(String dexPath, String optimizedDirectory, String librarySearchPath, ClassLoader parent) {\n super(dexPath, optimizedDirectory, librarySearchPath, parent);\n inMemoryDexClassLoader = new InMemoryDexClassLoader(dexPath, parent);\n }\n\n @Override\n protected Class<?> findClass(String name) throws ClassNotFoundException {\n try {\n return super.findClass(name);\n } catch (ClassNotFoundException e) {\n return inMemoryDexClassLoader.findClass(name);\n }\n }\n\n @Override\n public URL getResource(String name) {\n URL resource = super.getResource(name);\n if (resource == null) {\n resource = inMemoryDexClassLoader.getResource(name);\n }\n return resource;\n }\n}\n\n\n在自定义的 CustomDexClassLoader 类中,构造函数中传入了 dexPath、optimizedDirectory、librarySearchPath 和 parent 参数,其中 librarySearchPath 用于加载 so 库。\n\n在 findClass() 方法中,先调用父类的 findClass() 方法尝试从 dex 文件中加载类,如果找不到,则调用内部持有的 InMemoryDexClassLoader 的 findClass() 方法从内存中加载类。\n\n在 getResource() 方法中,先调用父类的 getResource() 方法尝试从 dex 文件中加载资源,如果找不到,则调用内部持有的 InMemoryDexClassLoader 的 getResource() 方法从内存中加载资源。\n\n通过自定义的 CustomDexClassLoader 类,可以在低版本的 Android 系统中使用 InMemoryDexClassLoader 来加载 dex 文件中的类和资源,从而弥补不能读取 so 的缺陷。
原文地址: https://www.cveoy.top/t/topic/qbqe 著作权归作者所有。请勿转载和采集!