Использование MessagePack с Android

кто-то пытался использовать MessagePack С Android-приложением?
Возможно ли это? Я попытался использовать банку из 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.jar, slf4j-api-1.6.2.jar и slf4j-jdk14-1.6.2.jar в своем .

в моем серверном приложении этот код отлично работает с теми же библиотеками.

4 ответов


(надеюсь) окончательное обновление

msgpack : 0.6.8 работает на Android, без каких-либо проблем

msgpack-rpc : 0.7.0 работает на Android с одной оговоркой.

в частности, вам нужно добавить следующее в onCreate для уровня API 8 (Android 2.2.1) и, возможно, ниже:

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

из-за эта ошибка.

если вы хотите увидеть простой пример, вот пара проекты, созданные для этой цели:


Предыдущие Версии

обновление: начиная с 0.6.7 msgpack должен быть совместим с Android (есть небольшая зависимость вопрос исключения). Проверьте текст ниже для msgpack-rpc (который также может быть адаптирован в будущем).

Примечание: Если вы также используете msgpack-rpc, вам нужно сделать следующие шаги:

  1. скачать msgpack-ЭКП источник из в git://github-е. ком/msgpack/msgpack-ЭКП.ГИТ (особенно папка"java").
  2. изменения основных msgpack версия артефакт для одного вы построенный.
  3. на org.msgpack.протокол RPC.петля.Нетти.NettyEventLoop изменить NioClientSocketChannelFactory to OioClientSocketChannelFactory (getWorkerExecutor ()).
  4. создайте MessagePack-RPC таким же образом, как и в случае основной банки MessagePack (см. Шаг 11 выше).

на NettyEventLoop замена из-за этого вопрос: http://markmail.org/message/ypa3nrr64kzsyfsa .

важно: Я только проверил синхронно общение. Асинхронный может не работать.


и вот причина, по которой msgpack не работает с Android до 0.6.7:

причина ошибки заключается в том, что MessagePack использует несколько java.классы фасоли, которые не включены в Android SDK. Ты вероятно, используя MessagePackBeans Примечание.

это аналогичная проблема с описанной здесь, для которого изложено общее решение здесь. К сожалению, в нашем случае это требует перестройки msgpack. Вот что я сделал (вы почти наверняка можете пропустить шаги 5 и 8, но я не пробовал это так):

  1. загрузите источник MessagePack из https://github.com/msgpack/msgpack-java.git.
  2. импортируйте источник MessagePack в качестве проекта в IDE.
  3. загрузите источник Apache Harmony для соответствующих пакетов из http://svn.apache.org/repos/asf/harmony/enhanced/java/trunk/classlib/modules/beans/src/main/java .
  4. скопируйте эти пакеты в проект MessagePack src / main / java :
    • java.бобы!--29-->
    • java.зернышки.beancontext в
    • org.апаш.гармония.бобы!--29-->
    • org.апаш.гармония.зернышки.внутренний.nls
  5. в проекте MessagePack удалите следующее занятия:
    • PropertyChangeListener
    • IndexedPropertyChangeEvent
    • PropertyChangeEvent
    • того, чтобы
    • PropertyChangeSupport
  6. переименовать java.бобы!--47--> пакеты для чего-то другого, например таможни.бобы!--47--> .
  7. изменить все java.бобы!--47--> ссылки на переименованные ID, поэтому снова например таможни.бобы!--47-->. Это относится особенно to BeansFieldEntryReader (этот класс является причиной исходной ошибки).
  8. изменить таможни.бобы!--47--> ссылки на пять классов, которые вы удалили в Шаг 5 на java.бобы!--47-->.
  9. на org.апаш.гармония.зернышки.внутренний.nls.Сообщения класс, прокомментируйте метод setLocale, и снять импорт, связанный с ним.
  10. удалить все классы, которые все еще имеют ошибки,за исключением кодер. В этом классе прокомментируйте все ссылки на удаленные классы. Теперь у вас должен быть безошибочный проект.
  11. построить банку MessagePack:
    • если вы используете Maven, измените версию в pom.xml для чего-то уникального, запустите Maven build с помощью установить цель, затем добавьте зависимость в свой Android проект С этой версией.
    • если вы не используя Maven, вы должны запустить jar цель для муравья с включенным построить.в XML. Замените банку msgpack в своем проекте Android на эту.
  12. если вы публикуете свое приложение, не забудьте включить соответствующее юридическое уведомление для Apache Harmony. Это Лицензия Apache, как и MessagePack.

это должно сделать это. Используя Ваш пример кода и мой собственный класс данных, я смог успешно упаковать и распаковать данные.

весь ритуал переименования связан с тем, что компилятор DEX жалуется на java.* именование пакетов.


существует критическая ошибка msgpack, говорящая, что данные, упакованные с msgpack, будут повреждены на виртуальной машине Dalvik. http://jira.msgpack.org/browse/MSGPACK-51


есть постоянные усилия @TheTerribleSwiftTomato и основной команды MessagePack, чтобы получить MessagePack работает на Android, пожалуйста, смотрите связанные выпуск GitHub. Исправление, упомянутое в ответе @TheTerribleSwiftTomato, должно быть найдено здесь.

обновление

мне удалось получить его, по крайней мере, на Android, (кропотливо) добавив все необходимое javassist классы, которые в настоящее время необходимы для сборки преуспевать. Дополнительный 600KB увеличение размера, но, по крайней мере, кажется, что это работает. В целом, он, похоже, работает в какой-то степени на Android, в конечном итоге проверить менее известные ресурсы о пакете сообщений, таких как его Группы Пользователей и Wiki для получения дополнительной информации.

на боковой заметке обязательно используйте библиотеку HTTP-запросов (например, loopj Android async HTTP или Apache С помощью HttpClient), который может работать с двоичными данные.

последнее, но не менее важное, вы можете пинговать меня, если есть интерес к этому jar что делает MessagePack, казалось бы, работать на Android – кредиты выходят, конечно, @TheTerribleSwiftTomato, который предоставил исправление выше!


Я предлагаю вам написать это в главном файле proguard-rules -

-dontwarn org.msgpack.**
-keep class org.msgpack.** { *; }