在Android中加载外部类

时间:2017-02-16 16:53:48

标签: android classnotfoundexception dexclassloader

我正在尝试使用DexClassLoader动态加载外部类,比如@Shlublu建议here

当我执行我的应用程序并且DexClassLoader对象尝试查找该类时,它会抛出ClassNotFound异常。我在manifest.xml中添加了读写权限,所以这不是错误。

我认为问题是我用来制作我想在我的应用程序上加载的.jar的方法。所以我有一些问题......

  • 使用dx将.java文件转换为.jar的正确方法是什么? 工具?
  • 加载外部类的包必须与我的.jar文件的包相同吗? (我认为不)

我正在使用Android模拟器API 19(kit-kat)

1 个答案:

答案 0 :(得分:0)

由于APK是标准的Android软件包,我建议您使用APK而不是JAR。构建一个应用程序APK链接所需的JAR(让Android构建工具" dex" JAR),但没有任何活动,然后安装APK,就好像它是一个普通的应用程序。然后,您可以使用PackageManager访问APK文件本身以获取其路径并使用DexClassLoader加载它。

public static ClassLoader loadAPK(final Context context, final String appName) throws PackageManager.NameNotFoundException {
    final String apkPath = context.getPackageManager().getApplicationInfo(appName, 0).sourceDir;
    final File tmpDir = context.getDir("tmp", 0);
    return new DexClassLoader(apkPath, tmpDir.getAbsolutePath(), null, context.getClassLoader());
}