2011-08-30 9 views
8

Próbowałem do włączyć android.jar do projektu Java, usunąć JRE z Build Path i uruchomić ten kod. Zgłasza wyjątek Runtime. Czemu?Korzystanie z android.jar w projekcie Java - 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); 
    } 
} 

Dlaczego ContentValues ​​jest używane tylko w środowisku Android?

Odpowiedz

16

Plik android.jar w pakiecie SDK zawiera tylko implementacje skrótów klas SDK, a nie rzeczywiste implementacje znalezione na urządzeniach (lub emulatorach). Słoik udostępnia metadane klasy, dzięki czemu aplikacje, które odwołują się do klas SDK, będą poprawnie budowane.

Nie można utworzyć projektu odwołującego się do pliku android.jar, który będzie działać poza urządzeniem z systemem Android.

+0

Dlaczego działają inne klasy Java, takie jak ArrayList lub Vector? – Emerald214

+1

@ Emerald214 Klasy JRE muszą znajdować się w ścieżce klas i nie mogą to być kody pośredniczące, ale klasy specyficzne dla systemu Android to kody pośredniczące. Są szkieletem, więc możesz kodować i kompilować swoją aplikację za pomocą IDE java, ale kod naprawdę tam nie jest, może niektóre z nich nie są nawet tworzone w Javie. – aalku

+0

Czy ktoś wie, gdzie mogę znaleźć prawdziwy build? –

5

android.jar zawiera tylko kody pośrednie, które pozwolą Ci zbudować Twój projekt, jak wyjaśnił @antlersoft.

Projekt Robolectric http://robolectric.org/ umożliwia uruchamianie testów na kodzie Android bez korzystania z urządzenia. Mają prawdziwe kompilacje dostępne na Maven http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.robolectric%22

Z powodzeniem używam większości kodu backendu Androidem, używając artefaktu android-all.

Może to nie pomóc w konkretnym przypadku, ponieważ niektóre interfejsy API są nadal poza zakresem, ale w przypadku większości innych przypadków z zakresu java.lang.RuntimeException: Stub!, w tym artefakty z Robolectric, powinny pomóc.

Powiązane problemy