如何从外部jar文件动态加载Android活动或类?

时间:2011-11-09 00:12:12

标签: android class load dynamic

这个问题实际上有几个部分:

  1. 如何创建可动态加载的外部jar文件?你能加载一个.apk文件作为.jar文件吗?你可以加载classes.dex吗?你需要使用dx工具转换一个jar文件吗?

  2. 我看到这段代码动态加载一个类:

        String jarfile = "test2.jar";
        DexClassLoader classloader = new DexClassLoader(
            jarfile, "/tmp", null, getClass().getClassLoader());
        Class<?> myclass = classloader.loadClass("Test2Activity");
    
  3. 在这种情况下,jar文件位于何处?换句话说,当我安装我的主Android应用程序时,我需要test2.jar文件的路径。

    感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我认为这是不可能的,至少您可以启动的每个Activity的引用都需要存在于项目清单中。所以,即使这是可能的,我认为它仍然会失败。您是否尝试过考虑Setting up a Library Project作为替代方案?

答案 1 :(得分:0)

我其实正在寻找类似的答案 - 我已经设法找到一种方法来动态地将jar文件加载到android应用程序 - 就在这里通过这个链接溢出堆栈: - 你需要的一切都在这里 - 除了我添加了一些我花时间试图找出链接下面的东西 - 这可能对你有用

<强> http://stackoverflow.com/questions/11453614/how-can-i-load-a-jar-file-dynamically-in-an-android-application-4-0-3

以下是需要注意的一些事项:

  1. 创建.jar时:您只需要动态加载的.class文件 - 您不需要在.jar文件中包含接口IPeripheral。

  2. 使用IDE构建.jar文件 - 我不会使用以下命令编辑通过在命令行中调用jar选项而生成的默认清单文件 - 像这样:“jar cmf manifest-addition jar-文件输入文件“。而是打开eclipse,转到文件&gt;出口&gt; Java和GT; Jar文件并遵循它。

  3. 选择清单文件时 - 选择自定义,只需在项目中创建清单文件作为无文本文本文件,并将其保存为Whatever.manifest确保此文本文件最后一行为空该文件!

  4. 在上面链接的示例代码中:确保仔细检查此行的实际操作:

    dalvik.system.PathClassLoader myClassLoader = new dalvik.system.PathClassLoader(urls.get(index).toString(), ModuleLoader.class.getClassLoader());
    
  5. 我说这是因为urls.get(index).toString()将返回file:/ pathname,你想要的只是路径名。我只是简单地解析了它以使其工作。

    1. 创建SDCard - 只需从Android设备管理器执行 - 有一个设置外部存储的选项 - 选择一个大小。在DDMS中,您将能够打开“文件资源管理器”,您将在mnt文件夹中找到SD卡,并能够将您的jar文件推送到SD卡文件夹中。

    2. 这是我的Main_activity类,它调用模块加载器。

      public class MainActivity extends Activity 
      {
          private static Context context;
          @Override
          public void onCreate(Bundle savedInstanceState) 
          {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
      
              //Get this classes context
              MainActivity.context = getApplicationContext();
      
              // method to return a list of modules that all implement the interface IPeripheral 
              List<IPeripheral> modules = ModuleLoader.loadModules("/mnt/sdcard", getApplicationContext());
      
              //Accessing a method - and display is just a method that toasts.
              display(modules.get(0).getName());
          }
      }
      

      希望这会有所帮助 - 我认为你不可能动态添加实际上是“屏幕”或Android活动的Java文件的jar文件,因为这需要你以编程方式编辑Projects Android Manifest文件您正试图动态加载jar。我不认为这会带来安全风险。