Android 上的 Jeromq:没有虚拟方法clear()Ljava/nio/ByteBuffer

Wat*_*nka 4 java android zeromq jeromq

我正在尝试将 jeromq 用于 android 项目。我需要连接到另一个经销商设备。这是我的代码:

ZContext zcontext = new ZContext(1);
ZMQ.Socket zsocket = zcontext.createSocket(ZMQ.DEALER);
String identity = "S61_phone";
zsocket.setIdentity(identity.getBytes(ZMQ.CHARSET));
zsocket.connect("tcp://my_other_device_ip_and_port_here");
zsocket.send("test",0);
Run Code Online (Sandbox Code Playgroud)

在 connect 调用时,发生错误:

2019-09-26 16:59:53.033 18347-18379/?E/AndroidRuntime:致命异常:Thread-4 进程:com.flir.flironeexampleapplication,PID:18347 java.lang.NoSuchMethodError:没有虚拟方法clear()Ljava/nio/ByteBuffer;在类 Ljava/nio/ByteBuffer 中;或其超类(“java.nio.ByteBuffer”的声明出现在 /system/framework/core-oj.jar 中)位于 zmq.Signaler.send(Signaler.java:97) 处 zmq.Mailbox.send(Mailbox.java :71)在zmq.Ctx.sendCommand(Ctx.java:517)在zmq.ZObject.sendCommand(ZObject.java:382)在zmq.ZObject.sendPlug(ZObject.java:185)在zmq.ZObject.sendPlug(ZObject) .java:175) 在 zmq.Own.launchChild(Own.java:115) 在 zmq.SocketBase.addEndpoint(SocketBase.java:590) 在 zmq.SocketBase.connect(SocketBase.java:582) 在 org.zeromq.ZMQ $Socket.connect(ZMQ.java:2531) 位于 com.flir.flironeexampleapplication.GLPreviewActivity.onDeviceConnected(GLPreviewActivity.java:115) 位于 com.flir.flironesdk.EmbeddedDevice$4.run(EmbeddedDevice.java:512) 位于 java.lang .Thread.run(Thread.java:764)

我的环境:

  • 杰罗姆克 0.5.2
  • 执行代码的目标设备是Android 8.1 (Oreo)
  • 使用 JDK 1.8.0_66 / ndk r10e 在 Android Studio 中编译

知道问题是什么吗?多谢。

raf*_*afa 7

我在这里找到了解释和解决方法

Java 9 为驱动程序使用的 java.nio.ByteBuffer 中的以下方法引入了具有协变返回类型的重写方法。

  • 位置
  • 限制
  • 翻动
  • 清除

在 Java 9 中,它们现在都返回 ByteBuffer ,而它们重写的方法则返回 Buffer ,导致在 Java 8 及更低版本上执行时出现此类异常。

这是因为生成的字节码包含方法的静态返回类型,在 Java 8 及更低版本中找不到该类型,因为具有协变返回类型的重载方法不存在。

解决方案是在调用该方法之前将 ByteBuffer 实例强制转换为 Buffer。