在Android上使用MessagePack

有人尝试过使用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.jarmsgpack-0.5.2.jarslf4j-api-1.6.2.jarslf4j-jdk14-1.6.2.jar在我的lib目录中。

在我的服务器应用程序中,此代码可以在相同的库中正常工作。

回答:

(希望如此)最终更新

0.6.8可在Android上正常使用

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


回答:

  1. 从 _git://github.com/msgpack/msgpack-rpc.git_ (特别是 )下载msgpack-rpc源。
  2. 将主要msgpack工件版本更改为您已构建的版本。
  3. org.msgpack.rpc.loop.netty.NettyEventLoop中 ,将 NioClientSocketChannelFactory 更改为 OioClientSocketChannelFactory(getWorkerExecutor())
  4. 以与主MessagePack JAR相同的方式构建MessagePack-RPC(请参阅上面的 步骤11 )。

NettyEventLoop 更换是由于这个问题:

http://markmail.org/message/ypa3nrr64kzsyfsa

我仅测试了 通信。异步可能不起作用。


这是msgpack在以下版本之前无法与Android配合使用的原因0.6.7

发生错误的原因是MessagePack使用了Android SDK中未包含的几个java.beans类。您可能正在使用 MessagePackBeans

批注。

这是一个类似的问题所描述的一个这里,为此,一般的解决方案中概述这里。不幸的是,在我们的情况下,它需要重建msgpack。这就是我所做的(几乎可以肯定,您可以跳过第5步和第8步,但是我还没有尝试过):

  1. https://github.com/msgpack/msgpack-java.git 下载MessagePack源。
  2. 将MessagePack源作为项目导入到IDE中。
  3. http://svn.apache.org/repos/asf/harmony/enhanced/java/trunk/classlib/modules/beans/src/main/java 下载相关软件包的Apache Harmony源。
  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
    • 物业变更支持

  6. java.beans 包重命名为其他名称,例如 custom.beans
  7. java.beans 引用更改为重命名的ID,然后再次更改,例如 custom.beans 。这 适用于 BeansFieldEntryReader (此类是原始错误的原因)。
  8. 将在 * __
  9. org.apache.harmony.beans.internal.nls.Messages 类中,注释掉 setLocale 方法,并删除与之关联的导入。
  10. 删除所有仍然有错误的类, Encoder 。在该类中,注释掉对已删除类的所有引用。您现在应该有一个没有错误的项目。
  11. 构建MessagePack JAR:

    • 如果您使用的是Maven,请将pom.xml中的版本更改为唯一的版本,运行具有 安装 目标的Maven build ,然后 在您的Android项目中添加依赖项。
    • 如果您 使用Maven,则必须使用随附的 build.xml 为Ant 运行 jar 目标。用这个替换您的Android项目中的msgpack JAR。 __

  12. 如果要发布应用程序,请记住包括有关Apache Harmony的相关法律声明。就像MessagePack一样,这是Apache许可。

那应该做。使用您的示例代码和我自己的数据类,我能够成功打包和解压缩数据。

整个重命名仪式归因于DEX编译器抱怨java。*包命名的事实。

以上是 在Android上使用MessagePack 的全部内容, 来源链接: utcz.com/qa/422768.html

回到顶部