2011-08-30 50 views
8

我試圖將包括android.jar轉化爲Java項目,從Build Path中刪除JRE並運行此代碼。它引發運行時異常。爲什麼?在Java項目中使用android.jar - RuntimeException Stub?

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環境中使用?

回答

16

SDK中的android.jar只包含SDK類的存根實現,而不包含在設備(或模擬器)上找到的實際實現。該jar只是提供了類的元數據,以便引用SDK類的應用程序能夠正確構建。

您不能創建任何引用將在Android設備外部運行的android.jar的項目。

+0

爲什麼其他Java類可以工作,如ArrayList或Vector? – Emerald214

+1

@ Emerald214 JRE類必須位於你的類路徑中,並且它們不能是存根,但是android特定的類是存根。它們是一個框架,因此您可以使用java IDE對應用程序進行編碼和編譯,但代碼並不存在,也可能其中一些甚至不是用Java編寫的。 – aalku

+0

有誰知道我在哪裏可以找到一個真正的構建? –

5

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的工件應該有所幫助。