2011-05-08 17 views
8

Uso la biblioteca de Guava r09 en una aplicación de Android pero aparece el siguiente error cuando lo uso con 1.6. Es un poco extraño porque funciona bien en 1.5. Además, el método que "no se encuentra" está muy claro allí. También intenté incluir el archivo jsr305.jar, pero esto aún no funciona.Uso de Google Guava con Android 1.6

Aprecie cualquier ayuda, hacer E/S en Java es tan doloroso sin guayaba.

Este es el código:

String timestamp = CharStreams.toString(
    CharStreams.newReaderSupplier(timestampFile, Charset.forName("UTF-8"))); 

Ésta es la excepción:

05-08 12:16:41.163: ERROR/dalvikvm(335): Could not find method com.google.common.io.LineReader.<init>, referenced from method com.google.common.io.CharStreams.readFirstLine 
05-08 12:16:41.163: WARN/dalvikvm(335): VFY: unable to resolve direct method 6798: Lcom/google/common/io/LineReader;.<init> (Ljava/lang/Readable;)V 
05-08 12:16:41.163: WARN/dalvikvm(335): VFY: rejecting opcode 0x70 at 0x0009 
05-08 12:16:41.163: WARN/dalvikvm(335): VFY: rejected Lcom/google/common/io/CharStreams;.readFirstLine (Lcom/google/common/io/InputSupplier;)Ljava/lang/String; 
05-08 12:16:41.163: WARN/dalvikvm(335): Verifier rejected class Lcom/google/common/io/CharStreams; 
05-08 12:16:41.163: DEBUG/AndroidRuntime(335): Shutting down VM 
05-08 12:16:41.163: WARN/dalvikvm(335): threadid=3: thread exiting with uncaught exception (group=0x4001aa28) 
05-08 12:16:41.173: ERROR/AndroidRuntime(335): Uncaught handler: thread main exiting due to uncaught exception 
05-08 12:16:41.183: ERROR/AndroidRuntime(335): java.lang.VerifyError: com.google.common.io.CharStreams 
     at com.triposo.droidguide.rometest.LocationStoreInstaller.install(LocationStoreInstaller.java:33) 
     at com.triposo.droidguide.rometest.SplashActivity.onStart(SplashActivity.java:58) 
     at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1205) 
     at android.app.Activity.performStart(Activity.java:3520) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2373) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417) 
     at android.app.ActivityThread.access$2100(ActivityThread.java:116) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:123) 
     at android.app.ActivityThread.main(ActivityThread.java:4203) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:521) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549) 
     at dalvik.system.NativeStart.main(Native Method) 
+0

¿Qué código causa este problema? –

+0

Edité la pregunta para agregar el código. –

Respuesta

5

Pude resolver esto al final. Si utilizo jarjar para cambiar el nombre de com.google.common.io.LineReader a otro nombre de paquete (por ejemplo, com.triposo.vendor.com.google.common.io.LineReader) ¡funciona! Mi suposición es que LineReader está incluido en Android pero con una versión ligeramente diferente (incompatible).

1

Es por esto que el uso de llamadas a la API de Android indocumentados está mal. CharStreams nunca formó parte de la API de Android (no verá que se mencione su eliminación en el 1.6 changelog).

Las clases o métodos no documentados podrían desaparecer sin previo aviso de cualquier revisión del sistema operativo, como sucedió aquí.

+0

CharStreams es parte de Guava, que es la tercera biblioteca que intento usar. De esto se trata la pregunta. Funciona en 1.5 y en 2.x, por lo que está sucediendo algo en 1.6 que sospecho que es un error. –

+0

Está bien, está buscando 'com.google.common.io.LineReader', que es parte de Guava (ahora lo veo en el código fuente). Así que me retracto de mi declaración original, parece un problema con el cargador/verificador de clases. ¿Cómo los importas a tu proyecto? ¿Es todo solo un .jar? Mulitple .jars? ¿O estás tomando el código fuente sin procesar? – EboMike

+0

Ok, resolví esto. Si utilizo jarjar para cambiar el nombre de com.google.common.io.LineReader a otro paquete, ¡todo funciona! Mi suposición es que LineReader está incluido con una versión ligeramente diferente en Android. –

Cuestiones relacionadas