Использование 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");
из-за эта ошибка.
если вы хотите увидеть простой пример, вот пара проекты, созданные для этой цели:
- https://github.com/mikkoz/msgpack-android-test-server/tree/master/msgpack-android-test-server
- https://github.com/mikkoz/msgpack-android-test-client/tree/master/msgpack-android-test-client
Предыдущие Версии
обновление: начиная с 0.6.7 msgpack должен быть совместим с Android (есть небольшая зависимость вопрос исключения). Проверьте текст ниже для msgpack-rpc (который также может быть адаптирован в будущем).
Примечание: Если вы также используете msgpack-rpc, вам нужно сделать следующие шаги:
- скачать msgpack-ЭКП источник из в git://github-е. ком/msgpack/msgpack-ЭКП.ГИТ (особенно папка"java").
- изменения основных msgpack версия артефакт для одного вы построенный.
- на org.msgpack.протокол RPC.петля.Нетти.NettyEventLoop изменить NioClientSocketChannelFactory to OioClientSocketChannelFactory (getWorkerExecutor ()).
- создайте MessagePack-RPC таким же образом, как и в случае основной банки MessagePack (см. Шаг 11 выше).
на NettyEventLoop замена из-за этого вопрос: http://markmail.org/message/ypa3nrr64kzsyfsa .
важно: Я только проверил синхронно общение. Асинхронный может не работать.
и вот причина, по которой msgpack не работает с Android до 0.6.7
:
причина ошибки заключается в том, что MessagePack использует несколько java.классы фасоли, которые не включены в Android SDK. Ты вероятно, используя MessagePackBeans Примечание.
это аналогичная проблема с описанной здесь, для которого изложено общее решение здесь. К сожалению, в нашем случае это требует перестройки msgpack. Вот что я сделал (вы почти наверняка можете пропустить шаги 5 и 8, но я не пробовал это так):
- загрузите источник MessagePack из https://github.com/msgpack/msgpack-java.git.
- импортируйте источник MessagePack в качестве проекта в IDE.
- загрузите источник Apache Harmony для соответствующих пакетов из http://svn.apache.org/repos/asf/harmony/enhanced/java/trunk/classlib/modules/beans/src/main/java .
- скопируйте эти пакеты в проект MessagePack src / main / java :
- java.бобы!--29-->
- java.зернышки.beancontext в
- org.апаш.гармония.бобы!--29-->
- org.апаш.гармония.зернышки.внутренний.nls
- в проекте MessagePack удалите следующее занятия:
- PropertyChangeListener
- IndexedPropertyChangeEvent
- PropertyChangeEvent
- того, чтобы
- PropertyChangeSupport
- переименовать java.бобы!--47--> пакеты для чего-то другого, например таможни.бобы!--47--> .
- изменить все java.бобы!--47--> ссылки на переименованные ID, поэтому снова например таможни.бобы!--47-->. Это относится особенно to BeansFieldEntryReader (этот класс является причиной исходной ошибки).
- изменить таможни.бобы!--47--> ссылки на пять классов, которые вы удалили в Шаг 5 на java.бобы!--47-->.
- на org.апаш.гармония.зернышки.внутренний.nls.Сообщения класс, прокомментируйте метод setLocale, и снять импорт, связанный с ним.
- удалить все классы, которые все еще имеют ошибки,за исключением кодер. В этом классе прокомментируйте все ссылки на удаленные классы. Теперь у вас должен быть безошибочный проект.
- построить банку MessagePack:
- если вы используете Maven, измените версию в pom.xml для чего-то уникального, запустите Maven build с помощью установить цель, затем добавьте зависимость в свой Android проект С этой версией.
- если вы не используя Maven, вы должны запустить jar цель для муравья с включенным построить.в XML. Замените банку msgpack в своем проекте Android на эту.
- если вы публикуете свое приложение, не забудьте включить соответствующее юридическое уведомление для 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.** { *; }