2011-05-08 2 views
8

Android 앱에서 Guava r09 라이브러리를 사용하고 있지만 1.6과 함께 사용할 때 다음 오류가 발생합니다. 1.5에서 잘 작동하기 때문에 조금 이상합니다. 또한 "발견되지 않은"방법은 매우 분명합니다. 또한 jsr305.jar 파일을 포함하여 시도했지만 여전히 작동하지 않습니다.Android 1.6에서 Google Guava 사용

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

이 문제를 일으키는 코드는 무엇입니까? –

+0

코드를 추가하기 위해 질문을 편집했습니다. –

답변

5

나는 이것을 결국 해결할 수 있었다. jarjar를 사용하여 com.google.common.io.LineReader의 이름을 다른 패키지 이름 (예 : com.triposo.vendor.com.google.common.io.LineReader)으로 변경하면 작동합니다. 내 생각 엔 LineReader는 Android에는 번들이지만 약간 다른 (호환되지 않는) 버전이 번들되어 있습니다.

1

문서화되지 않은 안드로이드 API 호출을 나쁜됩니다 사용하는 이유입니다. CharStreams는 Android API의 일부가 아니 었습니다 (사용자가 1.6 changelog에 언급 된 것을 보지 못했습니다).

여기에있는 것처럼 문서화되지 않은 클래스 또는 메소드는 OS 개정판의 통지없이 사라질 수 있습니다.

+0

CharStreams는 내가 사용하려고하는 세 번째 라이브러리 인 Guava의 일부입니다. 이것은 질문에 관한 것입니다. 그것은 1.5와 2.x에서 작동합니다. 1.6에서 버그가 있다고 의심되는 부분이 있습니다. –

+0

좋아요, Guava의 일부인'com.google.common.io.LineReader'를 찾고 있습니다 (이제는 소스 코드에서 볼 수 있습니다). 그래서 나는 원래의 문장을 철회했다. 클래스 로더/검증 자의 문제처럼 보인다. 프로젝트로 가져 오는 방법은 무엇입니까? 모든 것이 단지 하나의 .jar입니까? 여러 .jars? 아니면 원시 소스 코드를 가져 가고 있습니까? – EboMike

+0

좋아, 나는 이것을 해결했다. jarjar를 사용하여 com.google.common.io.LineReader의 이름을 다른 패키지로 바꾸면 모두 작동합니다! 내 생각 엔 LineReader가 Android에서 약간 다른 버전에 포함되어 있다는 것입니다. –

관련 문제