12

誰かがMessagePackAndroidアプリで使用しようとしましたか?
出来ますか?からJarを使用しようとしmsgpack-javaましたが、次の例外が発生しました。

Caused by: java.lang.ExceptionInInitializerError
  at org.msgpack.Packer.pack(Packer.java:532)
  at org.msgpack.MessagePack.pack(MessagePack.java:31)
  ... 15 more
  Caused by: java.lang.ExceptionInInitializerError
  at org.msgpack.template.TemplateRegistry.<clinit>(TemplateRegistry.java:38)
  ... 17 more
  Caused by: java.lang.VerifyError: org.msgpack.template.BeansFieldEntryReader
  at org.msgpack.template.builder.BeansTemplateBuilder.<init (BeansTemplateBuilder.java:42)
  at org.msgpack.template.builder.BuilderSelectorRegistry.initForJava(BuilderSelectorRegistry.java:73)
  at org.msgpack.template.builder.BuilderSelectorRegistry.<clinit>(BuilderSelectorRegistry.java:38)
  ... 18 more

私が使用するコードは非常に単純です

PrintWriter out = new PrintWriter(socket.getOutputStream());
Message msg = new Message();
msg.body = "asdasdasd";
msg.from = "qwe";
msg.to = "ttt";
byte[] bytes = MessagePack.pack(msg);
out.print(bytes);
out.flush();

私のディレクトリ にはjavassist.jar、、、msgpack-0.5.2.jarslf4j-api-1.6.2.jarあります。slf4j-jdk14-1.6.2.jarlib

私のサーバーアプリケーションでは、このコードは同じライブラリで正常に機能します。

4

4 に答える 4

14

(うまくいけば)最終更新

msgpack0.6.8Androidで問題なく動作します

msgpack-rpc0.7.0Androidで動作しますが、注意点が1つあります。

onCreate具体的には、APIレベル8(Android 2.2.1)以下に以下を追加する必要があります。

java.lang.System.setProperty("java.net.preferIPv4Stack", "true");
java.lang.System.setProperty("java.net.preferIPv6Addresses", "false");

このバグが原因です。

簡単な例を見たい場合は、この目的のために設定された2つのプロジェクトを次に示します。


以前のバージョン

更新:0.6.7の時点で、msgpackはAndroidと互換性があるはずです(小さな依存関係の除外の問題があります)。以下のテキストでmsgpack-rpcを確認してください(これも将来的に適応される可能性があります)。

注:msgpack-rpcも使用している場合は、次の手順を実行する必要があります。

  1. msgpack-rpcソースをgit://github.com/msgpack/msgpack-rpc.git(具体的には「java」フォルダー)からダウンロードします。
  2. メインのmsgpackアーティファクトのバージョンを作成したものに変更します。
  3. org.msgpack.rpc.loop.netty.NettyEventLoopで、NioClientSocketChannelFactoryOioClientSocketChannelFactory(getWorkerExecutor())に変更します
  4. メインのMessagePackJARの場合と同じ方法でMessagePack-RPCをビルドします(上記のステップ11を参照)。

NettyEventLoopの置き換えは、次の問題が原因です: http : //markmail.org/message/ypa3nrr64kzsyfsa

重要:私は同期通信のみをテストしました。非同期が機能しない可能性があります。


そして、これがmsgpackが以前のAndroidで機能しなかった理由です0.6.7

エラーの理由は、MessagePackがAndroidSDKに含まれていないいくつかのjava.beansクラスを使用しているためです。おそらくMessagePackBeansアノテーションを使用しています。

これは、ここで説明されている問題と同様の問題であり、一般的な解決策がここで概説されています。残念ながら、私たちの場合、msgpackの再構築が必要です。これが私がしたことです(ステップ5と8はほぼ確実にスキップできますが、そのように試したことはありません):

  1. https://github.com/msgpack/msgpack-java.gitからMessagePackソースをダウンロードします。
  2. MessagePackソースをIDEのプロジェクトとしてインポートします。
  3. 関連するパッケージのApacheHarmonyソースをhttp://svn.apache.org/repos/asf/harmony/enhanced/java/trunk/classlib/modules/beans/src/main/javaからダウンロードします。
  4. これらのパッケージをMessagePackプロジェクトのsrc/main/javaフォルダー にコピーします。
    • java.beans
    • java.beans.beancontext
    • org.apache.harmony.beans
    • org.apache.harmony.beans.internal.nls
  5. MessagePackプロジェクトで、次のクラスを削除します。
    • PropertyChangeListener
    • IndexedPropertyChangeEvent
    • PropertyChangeEvent
    • PropertyChangeListenerProxy
    • PropertyChangeSupport
  6. java.beansパッケージの名前を、 custom.beansなどの別の名前に変更します。
  7. すべての java.beans参照を名前が変更されたIDに変更します。たとえば、custom.beansを再度変更します。これは特にBeansFieldEntryReaderに当てはまります(このクラスが元のエラーの理由です)。
  8. 手順5で削除した5つのクラスのcustom.beans参照をjava.beansに戻します。
  9. org.apache.harmony.beans.internal.nls.Messagesクラスで、メソッドsetLocaleをコメントアウトし、それに関連付けられているインポートを削除します。
  10. エンコーダーを除い て、まだエラーがあるすべてのクラスを削除します。そのクラスで、削除したクラスへのすべての参照をコメントアウトします。これで、エラーのないプロジェクトができました。
  11. MessagePackJARをビルドします。
    • Mavenを使用している場合は、pom.xmlのバージョンを一意のものに変更し、インストール目標を指定してMavenビルドを実行してから、そのバージョンを使用してAndroidプロジェクトに依存関係を追加します。
    • Mavenを使用していない場合は、付属のbuild.xmlを使用してAntのjarゴールを実行する必要があります。AndroidプロジェクトのmsgpackJARをこれに置き換えます。
  12. アプリを公開する場合は、ApacheHarmonyに関連する法的通知を含めることを忘れないでください。これは、MessagePackと同じようにApacheライセンスです。

それはそれをする必要があります。サンプルコードと私自身のデータクラスを使用して、データを正常にパックおよびアンパックすることができました。

名前変更の儀式全体は、DEXコンパイラがjava。*パッケージの名前付けについて不平を言うという事実によるものです。

于 2011-10-02T01:40:58.130 に答える
0

msgpackでパックされたデータがDalvikVMで破損するという重大なmsgpackバグがあります。http://jira.msgpack.org/browse/MSGPACK-51

于 2011-10-31T22:06:47.510 に答える
0

@TheTerribleSwiftTomatoとMessagePackコアチームがAndroidでMessagePackを動作させるための継続的な取り組みを行っています。関連する、GitHubの問題をご覧ください。@TheTerribleSwiftTomatoの回答に記載されている修正は、ここにあります。

アップデート

javassistビルドを成功させるために現在必要なすべてのクラスを(苦労して)追加することで、少なくともAndroidで実行できるようになりました。サイズがさらに600KB大きくなりますが、少なくともそれは機能しているようです。全体として、Androidである程度機能しているように見えます。最終的には、ユーザーグループWikiなど、メッセージパックに関するあまり知られていないリソースで詳細を確認してください。

ちなみに、バイナリデータを処理できるHTTPリクエストライブラリ(LoopJのAndroid Async HTTPやApacheのHttpClientなど)を必ず使用してください。

最後になりましたが、これに関心があり、MessagePackがAndroidで機能しているように見える場合は、私にpingjarを送信できます。もちろん、上記の修正を提供した@TheTerribleSwiftTomatoにクレジットが付与されます。

于 2012-08-15T06:43:57.377 に答える
0

これをメインのproguard-rulesファイルに書き込むことをお勧めします-

-dontwarn org.msgpack.**
-keep class org.msgpack.** { *; }
于 2017-05-10T07:22:18.170 に答える