2011-05-08 108 views
8

我在Android應用程序中使用Guava r09庫,但在1.6版本中使用它時出現以下錯誤。這有點奇怪,因爲它在1.5中正常工作。此外,「未找到」的方法非常明確。我也試過包括jsr305.jar文件,但這仍然不起作用。使用Google Guava和Android 1.6

感謝任何幫助,在沒有番石榴的情況下在Java中進行I/O操作是非常痛苦的。

這是代碼:

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

這是例外:

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

什麼代碼導致此問題? – 2011-05-14 05:15:57

+0

我編輯了問題以添加代碼。 – 2011-05-18 07:11:14

回答

5

我終於設法解決了這個問題。如果我使用jarjar將com.google.common.io.LineReader重命名爲另一個包名稱(例如,com.triposo.vendor.com.google.common.io.LineReader),那麼它可以工作!我的猜測是,LineReader捆綁在Android中,但具有稍微不同(不兼容)的版本。

1

這就是爲什麼使用無證的Android API調用是壞的。 CharStreams從來不是Android API的一部分(你沒有看到它在1.6 changelog中被提及)。

未記錄的類或方法可能在沒有任何OS修訂版的通知的情況下消失,就像它發生在這裏一樣。

+0

CharStreams是Guava的一部分,它是我嘗試使用的第三個庫。這就是問題所在。它適用於1.5和2.x,因此1.6中有些事情我懷疑是bug。 – 2011-05-20 04:21:04

+0

好的,它正在尋找'com.google.common.io.LineReader',它是Guava的一部分(我現在在源代碼中看到它)。所以我收回了我原來的陳述 - 這看起來像是類加載器/驗證器的問題。你如何將它們導入你的項目?整個事情只是一個.jar? Mulitple .jars?或者你正在採取原始的源代碼? – EboMike 2011-05-20 06:04:29

+0

好吧,我解決了這個問題。如果我使用jarjar將com.google.common.io.LineReader重命名爲另一個軟件包,它一切正常!我的猜測是LineReader在Android中包含一個稍微不同的版本。 – 2011-06-20 11:29:53