【问题标题】:libriaries on AndroidAndroid 上的库
【发布时间】:2010-04-07 09:55:18
【问题描述】:

在本机开发中,您可以生成其他库和程序可以共享的库 - .so、.dll 等。

在 Java 中,您可以将代码放在类路径中的 JAR 中,其他程序和库可以使用它。

那么如何在 Android 中进行模块化程序呢?我从文档中得到的印象是每个 APK 都是一个独立的岛屿。不同的 APK 可以共享代码吗?

当您有这些外部依赖项时,安装如何工作?您能否指定您依赖 APK 中没有的库并安装它?

如果您不能拥有“动态链接”,您是否可以通过开发共享代码并以某种方式将 JAR 等效项放入每个需要它的 APK 中来实现“静态链接”?

【问题讨论】:

    标签: java android


    【解决方案1】:

    关于静态链接,您可以使用标准 Java 方式使用 .jar 文件在 Android 应用程序之间共享代码。但是,您目前不能使用 Android 资源系统(“res”目录下的内容和“R”类),这在某种程度上阻碍了控制库的想法。它还使得使用可本地化的字符串变得不可能,并且您不能拥有应用程序或服务定义,或者在 AndroidManifest.xml 中声明的任何其他内容。

    关于动态链接,有一种库作为 .apk 本身在 Market 中分发,并在运行时动态包含。许多开发人员不愿意要求他们的用户安装两个 .apk。这种方法确实会导致用户混淆。

    【讨论】:

    • 您能否详细解释一下动态链接的工作原理,或者提供一些可以在 Google 上搜索到的关键字?
    • 这是一个非常合理的问题,但老实说,我很难找到有关此技术的资源。我知道它可以完成,因为它是通过市场库(例如 Text-To-Speech)完成的:code.google.com/p/eyes-free
    • 嗯,所以它有一个静态库存根,它可能通过 APK 公开的服务使用主 APK 中的功能。这是我目前使用的方法,也是我试图寻找替代方法的方法;)
    【解决方案2】:

    您可以像 Jim Blackler 所说的那样在 .jar 文件中创建一个库,而不是使用类的全名从类中实例化。在 java 中,这真的很简单,可以用来使您的开发非常灵活。

    这里是一个例子:

    C 包含在一个名为 com.test.utils 的包中,因此它的完整路径是:com.test.utils.C .现在,如果您想从任何其他地方创建 C 的实例,请使用 Class.forName() 方法,其工作原理如下:

    // Try to create an instance of class 'com.test.utils.C'
    try {
        Object instance = Class.forName("com.test.utils.C").newInstance();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    

    考虑到你的类至少需要一个空的构造函数,否则你会出现异常。

    【讨论】:

    【解决方案3】:

    这是一个使用 Class.forName() 的完整示例:

    try { 
        for (Method ele: Class.forName("<MyClassPath>").getMethods()) 
        { 
            try { 
                if (ele.getName().equals("<MyMethod>") ) 
                    ele.invoke(null, ArgumentList); 
            } catch (IllegalArgumentException e) { 
                e.printStackTrace(); 
            } catch (IllegalAccessException e) { 
                e.printStackTrace(); 
            } catch (InvocationTargetException e) { 
                e.printStackTrace(); 
            } 
        } 
    } catch (ClassNotFoundException e) { 
        e.printStackTrace(); 
    }
    

    这里你可以找到更多关于调用方法的信息:http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Method.html#invoke(java.lang.Object, java.lang.Object[])

    【讨论】:

    • 双重答案,并在 android 上使用 e.printStackTrace() - 哎哟。
    • 我做了另一个答案,因为有评论字符限制:D 除了它只是示例代码......
    猜你喜欢
    • 2015-07-21
    • 2011-03-15
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    • 2012-07-21
    相关资源
    最近更新 更多