2016-05-05 4 views
0

アンドロイドのアプリケーションをスケーラ(マクロロフレームワーク、重要な場合)を使って作成します。 Genson Libraryを使用してJSONを逆シリアル化する際に問題が発生します。私は、エミュレータ上でこのコードを実行する次のエラーを得たPC上で動作しているときアンドロイドのGenson問題 - スカラ。配列が見つかりませんでした。

05-05 10:55:29.996 5439-5439/? I/art: Not late-enabling -Xcheck:jni (already on) 
05-05 10:55:30.033 5439-5439/com.myapp.dfp W/System: ClassLoader referenced unknown path: /data/app/com.myapp.dfp-2/lib/x86 
05-05 10:55:30.316 5439-5439/com.myapp.dfp D/AndroidRuntime: Shutting down VM 
05-05 10:55:30.316 5439-5439/com.myapp.dfp E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.myapp.dfp, PID: 5439 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp.dfp/com.myapp.dfp.MainActivity}: scala.reflect.internal.MissingRequirementError: class scala.Array in JavaMirror with dalvik.system.PathClassLoader[DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/data/app/com.myapp.dfp-2/base.apk"],nativeLibraryDirectories=[/data/app/com.myapp.dfp-2/lib/x86, /vendor/lib, /system/lib]]] of type class dalvik.system.PathClassLoader with classpath [<unknown>] and parent being [email protected] of type class java.lang.BootClassLoader with classpath [<unknown>] and parent being primordial classloader with boot classpath [/system/framework/core-libart.jar:/system/framework/conscrypt.jar:/system/framework/okhttp.jar:/system/framework/core-junit.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/ims-common.jar:/system/framework/apache-xml.jar:/system/framework/org.apache.http.legacy.boot.jar] not found. 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
    at android.app.ActivityThread.-wrap11(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5417) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
    Caused by: scala.reflect.internal.MissingRequirementError: class scala.Array in JavaMirror with dalvik.system.PathClassLoader[DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/data/app/com.myapp.dfp-2/base.apk"],nativeLibraryDirectories=[/data/app/com.myapp.dfp-2/lib/x86, /vendor/lib, /system/lib]]] of type class dalvik.system.PathClassLoader with classpath [<unknown>] and parent being [email protected] of type class java.lang.BootClassLoader with classpath [<unknown>] and parent being primordial classloader with boot classpath [/system/framework/core-libart.jar:/system/framework/conscrypt.jar:/system/framework/okhttp.jar:/system/framework/core-junit.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/ims-common.jar:/system/framework/apache-xml.jar:/system/framework/org.apache.http.legacy.boot.jar] not found. 
    at scala.reflect.internal.MissingRequirementError$.signal(MissingRequirementError.scala:17) 
    at scala.reflect.internal.MissingRequirementError$.notFound(MissingRequirementError.scala:18) 
    at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:53) 
    at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:66) 
    at scala.reflect.internal.Mirrors$RootsBase.getClassByName(Mirrors.scala:102) 
    at scala.reflect.internal.Mirrors$RootsBase.getRequiredClass(Mirrors.scala:105) 
    at scala.reflect.internal.Definitions$DefinitionsClass.ArrayClass$lzycompute(Definitions.scala:440) 
    at scala.reflect.internal.Definitions$DefinitionsClass.ArrayClass(Definitions.scala:440) 
    at scala.reflect.internal.Definitions$DefinitionsClass.arrayType(Definitions.scala:827) 
    at scala.reflect.internal.Definitions$DefinitionsClass$$anonfun$JavaRepeatedParamClass$1.apply(Definitions.scala:374) 
    at scala.reflect.internal.Definitions$DefinitionsClass$$anonfun$JavaRepeatedParamClass$1.apply(Definitions.scala:374) 
    at scala.reflect.internal.Definitions$DefinitionsClass.specialPolyClass(Definitions.scala:1268) 
    at scala.reflect.internal.Definitions$DefinitionsClass.JavaRepeatedPa 
05-05 11:00:30.355 5439-5439/com.myapp.dfp I/Process: Sending signal. PID: 5439 SIG: 9 

デシリアライズは、(スタンドアロンScalaのアプリとして)

を正常に動作します。ここ

は、最小限のエラーコード

case class Model(a: Int, b: String) 

class MainActivity extends FragmentActivity with Contexts[FragmentActivity] with IdGeneration with AkkaActivity { 
.... 
    override def onCreate(savedInstanceState: Bundle) = { 
     super.onCreate(savedInstanceState); 
     val m = com.owlike.genson.defaultGenson.fromJson[Model]("""{"a":1, "b":"hello"}""") 
     .... 
    } 

} 

です

オプションをbuild.sbtに追加しました。 は、hereとして推奨されていますが、それは役に立ちません。 、-keep class scala.Arrayを追加するためのオプションをProGuardのために、それはまた助けない私が試した

proguardOptions in Android ++= Seq(
    "-ignorewarnings", 
    "-keepattributes Signature", 
    "-keep class scala.Dynamic", 
    "-keep class scala.collection.SeqLike {public protected *;}", 
    "-keep public class scala.PartialFunction", 
    "-keep class com.owlike.genson.*{ *; }", 
    "-keep class com.myapp.** { *; }" 
) 

: はここに私のbuild.sbtの一部です。

他に何ができますか?


EDITED:gensonで成功し、gsonを使用しました。 Gsonは私にとってうまくいく。

+0

フィールドの代わりにプロパティを(それはGsonは基本的に何をするかである)を使用するように構成されている場合、それはGensonのJavaのバージョンで働いているだろう。その場合、これを試してみてください。 – eugen

+0

私はcirceまたはArgonautを使用します。両方とも、反射を全く使用しない高性能jsonパーサです。また、gensonまたはgsonとは違って慣用的なスカラです。 – pfn

答えて

0

Gensonを使用しないコードでscala.Arrayを使用できますか?それが存在することを確認するだけです。

次に、scala.Arrayを使用して、同時にGensonを使用してみます。それがうまくいくなら、これはおそらくproguardによってscala.Arrayが除外されていることを意味します。

これが機能しない場合は、Gensonが使用するクラスローダーにArrayクラスが表示されないと思われます。

val builder = new GensonBuilder().withClassLoader(Array.getClassLoader) 
val genson = new ScalaGenson(builder.withBundle(ScalaBundle()).create()) 
genson.fromJson... 
+0

Eugen、助けてくれてありがとう。私は自分のコードにArrayオブジェクトを持っているので、クラスパスに存在します。 ビルダーの例外は同じです。なぜ、stacktraceにscala.reflect。*クラスしか含まれていないのか分かりません。 – Alexander

+0

詳細なスタックトレースはありますか? Gensonコードのどの部分がそれを生成するかを示す何か? – eugen

+0

いいえ。PrintWriterに例外のスタックトレースを印刷しました.Gensonコードやアクティビティコードが表示されません。実際には、問題は今では関連していない、後で私は問題をキャッチするかもしれない – Alexander

関連する問題