【问题标题】:how can you dynamically load an Android activity or class from an external jar file?如何从外部 jar 文件动态加载 Android 活动或类?
【发布时间】:2011-12-24 22:09:08
【问题描述】:

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

  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");
    

在这种情况下,jar 文件应该放在哪里?换句话说,当我安装我的主要 android 应用程序时,我需要 test2.jar 文件的路径。

感谢您的帮助。

【问题讨论】:

    标签: android class load dynamic


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我实际上正在寻找类似的答案 - 我设法找到了一种将 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,转到 File> Export > Java> Jar File 并按照它进行操作。

      3. 在选择manifest文件时——选择customized,只需在项目中将manifest文件创建为无标题文本文件并保存为whatever.manifest确保该文本文件末尾有一行空文件!

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

        dalvik.system.PathClassLoader myClassLoader = new dalvik.system.PathClassLoader(urls.get(index).toString(), ModuleLoader.class.getClassLoader());
        

      我之所以这么说是因为 urls.get(index).toString() 会返回 file:/pathname,而你想要的只是路径名。我只是简单地把它解析出来让它工作。

      1. 要创建 SDCard - 只需从 android 设备管理器中进行 - 有一个设置外部存储的选项 - 选择大小。在 DDMS 中,您将能够打开“文件资源管理器”,您将在 mnt 文件夹中找到 sdcard,并能够将您的 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 File您正在尝试将 jar 动态加载到其中。我认为这是不可能的,因为它会带来安全风险。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-08
        • 2014-12-29
        • 1970-01-01
        • 2011-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-27
        相关资源
        最近更新 更多