Jeromq на Android: нет виртуального метода clear()Ljava/nio/ByteBuffer

Я пытаюсь использовать 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);

При вызове соединения возникает ошибка:

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).
  • Компиляция в Android Studio с JDK 1.8.0_66/ndk r10e

Есть идеи, в чем проблема? Большое спасибо.


person Watanka    schedule 26.09.2019    source источник
comment
Что-то не так с вашей установкой. Метод определенно существует.   -  person user207421    schedule 27.09.2019


Ответы (1)


Я нашел объяснение и обходной путь здесь

В Java 9 представлены переопределенные методы с ковариантными типами возвращаемого значения для следующих методов в java.nio.ByteBuffer, которые используются драйвером.

  • позиция
  • ограничение
  • кувырок
  • ясно

В Java 9 все они теперь возвращают ByteBuffer, тогда как методы, которые они переопределяют, возвращают Buffer, что приводит к подобным исключениям при выполнении в Java 8 и более ранних версиях.

Это связано с тем, что сгенерированный байтовый код включает в себя статический тип возвращаемого значения метода, > которого нет в Java 8 и более ранних версиях, поскольку не существует перегруженных методов с ковариантными > возвращаемыми типами.

Решение состоит в том, чтобы привести экземпляры ByteBuffer к Buffer перед вызовом метода.

person rafa    schedule 17.10.2019