2011-08-30 15 views
8

Intenté incluir android.jar en el proyecto de Java, eliminar JRE de la ruta de compilación y ejecutar este código. Lanza la excepción Runtime. ¿Por qué?Usando android.jar en el proyecto 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); 
    } 
} 

¿Por qué se usa ContentValues ​​solo en el entorno de Android?

Respuesta

16

El android.jar en el SDK solo contiene implementaciones de stub de las clases de SDK, no las implementaciones reales que se encuentran en los dispositivos (o emuladores). El archivo jar solo proporciona los metadatos de clase para que las aplicaciones que hacen referencia a las clases SDK se compilarán correctamente.

No puede crear ningún proyecto que haga referencia a android.jar que se ejecutará fuera de un dispositivo Android.

+0

¿Por qué funcionan otras clases de Java como ArrayList o Vector? – Emerald214

+1

@ Emerald214 Las clases de JRE deben estar en su classpath y no deben ser un talón, pero las clases específicas de Android son talones. Son un esqueleto hecho para que puedas codificar y compilar tu aplicación usando un IDE Java pero el código no está realmente allí, tal vez algunos de ellos ni siquiera están hechos en Java. – aalku

+0

¿Alguien sabe dónde puedo encontrar una construcción real? –

5

android.jar solo contiene apéndices, suficientes para que pueda compilar su proyecto, como explicó @antlersoft.

El proyecto Robolectric http://robolectric.org/ le permite ejecutar pruebas en su código de Android sin usar un dispositivo. Tienen construcciones reales disponibles en Maven http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.robolectric%22

He estado ejecutando con éxito la mayor parte del código de backend de Android mediante el artefacto android-all.

Puede que no sirva de ayuda en su caso específico, ya que algunas API todavía están fuera de los límites, pero para la mayoría de los demás casos de java.lang.RuntimeException: Stub!, los artefactos de Robolectric deberían ser de ayuda.

Cuestiones relacionadas