【问题标题】:Using android.jar in Java project - RuntimeException Stub?在 Java 项目中使用 android.jar - RuntimeException Stub?
【发布时间】:2011-08-30 17:46:14
【问题描述】:

我尝试将 android.jar 包含到 Java 项目中,从构建路径中删除 JRE 并运行此代码。它抛出运行时异常。为什么?

Exception in thread "main" java.lang.RuntimeException: Stub!
    at android.content.ContentValues.<init>(ContentValues.java:5)
    at JarTest.main(JarTest.java:5)

public class JarTest {
    public static void main(final String[] args) {
        final ContentValues values = new ContentValues();
        values.put("test", "test");
        System.out.println(values);
    }
}

为什么 ContentValues 只在 Android 环境中使用?

【问题讨论】:

    标签: java android


    【解决方案1】:

    SDK 中的 android.jar 仅包含 SDK 类的存根实现,而不是在设备(或模拟器)上找到的真实实现。该 jar 仅提供类元数据,以便您的引用 SDK 类的应用程序能够正确构建。

    您不能创建任何引用将在 Android 设备之外运行的 android.jar 的项目。

    【讨论】:

    • @Emerald214 JRE 类必须在您的类路径中,并且它们不能是存根,但 android 特定类是存根。它们是一个骨架,因此您可以使用 Java IDE 编写和编译您的应用程序,但代码并不存在,也许其中一些甚至不是用 Java 编写的。
    • 有谁知道我在哪里可以找到真正的构建?
    • @Janus Troselsen 这是一个仅在设备上运行的自定义二进制文件。我不会浪费时间尝试测试 Android 的代码,而是假设它可以工作,而是对其进行模拟和存根。如果你必须测试输出(我明白你为什么要至少确保他们的代码给你所期望的)然后围绕你可以在设备上运行的那些 Android API 的输出编写一组功能测试或在模拟器中。
    【解决方案2】:

    android.jar 仅包含存根,足以让您构建您的项目,正如@antlersoft 解释的那样。

    Robolectric 项目http://robolectric.org/ 允许您在不使用设备的情况下对您的 Android 代码运行测试。他们在 Maven http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.robolectric%22

    上提供了真正的构建

    我已经使用android-all 工件成功运行了大部分 Android 后端代码。

    在您的特定情况下可能无济于事,因为某些 API 仍然超出范围,但对于 java.lang.RuntimeException: Stub! 的大多数其他情况,包括来自 Robolectric 的工件应该会有所帮助。

    【讨论】:

      猜你喜欢
      • 2019-06-04
      • 2017-02-16
      • 2017-07-07
      • 2015-02-23
      • 2011-04-13
      • 2016-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多