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

android上的Jeromq:没有虚拟方法clear()Ljava/nio/ByteBuffer,java,android,zeromq,jeromq,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_

我正在尝试将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);
在connect调用时,发生错误:

2019-09-26 16:59:53.03318347-18379/?E/AndroidRuntime:致命 异常:Thread-4进程:com.flir.flironeexampleapplication,PID:18347 java.lang.NoSuchMethodError:No virtual method clear()Ljava/nio/ByteBuffer;在Ljava/nio/ByteBuffer类中;或者它的超类(声明'java.nio.ByteBuffer'出现在/system/framework/core oj.jar中) 在zmq.signer.send(signer.java:97) 在zmq.Mailbox.send(Mailbox.java:71)处 zmq.Ctx.sendCommand(Ctx.java:517)位于 zmq.ZObject.sendCommand(ZObject.java:382)位于 sendPlug(ZObject.java:185)位于 sendPlug(ZObject.java:175)位于 zmq.Own.launchChild(Own.java:115)位于 位于的zmq.SocketBase.addEndpoint(SocketBase.java:590) SocketBase.connect(SocketBase.java:582)位于 org.zeromq.ZMQ$Socket.connect(ZMQ.java:2531)位于 flir.flironeexampleapplication.GLPreviewActivity.ondeviconnected(GLPreviewActivity.java:115) 位于com.flir.flironesdk.EmbeddedDevice$4.run(EmbeddedDevice.java:512) 运行(Thread.java:764)

我的环境:

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

你知道问题出在哪里吗?非常感谢。

我找到了一个解释和解决方法

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

  • 位置
  • 极限
  • 翻转
  • 清楚的
在Java9中,它们现在都返回ByteBuffer,而它们重写返回缓冲区的方法,导致在Java8和更低版本上执行时出现这样的异常

这是因为生成的字节码包含方法的静态返回类型,>这在Java8和更低版本上找不到,因为不存在协变>返回类型的重载方法

解决方案是在调用方法之前将ByteBuffer实例强制转换为缓冲区


您的安装有问题。这种方法肯定存在。