Ошибка при загрузке gnu.io.RXTXCommDriver

Вопрос или проблема

Я пытаюсь запустить программу на Java, которая перечисляет все доступные порты, используя Eclipse IDE на Ubuntu 14.04. Моя программа выглядит следующим образом:

import gnu.io.CommPortIdentifier;

import java.util.Enumeration;


public class ListAvailablePorts {

public void list() {  
    Enumeration ports = CommPortIdentifier.getPortIdentifiers();  

    while(ports.hasMoreElements())  
        System.out.println(((CommPortIdentifier)ports.nextElement()).getName());
}
public static void main(String[] args) {
    new ListAvailablePorts().list(); 

}

}

Но она выводит следующее предупреждение и затем ошибку:

Java HotSpot(TM) 64-Bit Server VM warning: Вы загрузили библиотеку /usr/lib/jvm/java-8-oracle/jre/lib/amd64/librxtxSerial.so, которая, возможно, отключила защиту стека. Виртуальная машина попытается исправить защиту стека сейчас.
Рекомендуется исправить библиотеку с помощью 'execstack -c <libfile>', или связать её с '-z noexecstack'.
java.lang.UnsatisfiedLinkError: /usr/lib/jvm/java-8-oracle/jre/lib/amd64/librxtxSerial.so: /usr/lib/jvm/java-8-oracle/jre/lib/amd64/librxtxSerial.so: неверный класс ELF: ELFCLASS32 (Возможная причина: несоответствие ширины слова архитектуры) выброшено при загрузке gnu.io.RXTXCommDriver
Исключение в потоке "main" java.lang.UnsatisfiedLinkError: /usr/lib/jvm/java-8-oracle/jre/lib/amd64/librxtxSerial.so: /usr/lib/jvm/java-8-oracle/jre/lib/amd64/librxtxSerial.so: неверный класс ELF: ELFCLASS32 (Возможная причина: несоответствие ширины слова архитектуры)
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1937)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1843)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1119)
at gnu.io.CommPortIdentifier.<clinit>(CommPortIdentifier.java:83)
at ListAvailablePorts.list(ListAvailablePorts.java:11)
at ListAvailablePorts.main(ListAvailablePorts.java:17)

Привет, у меня была такая же проблема.

Я использую Ubuntu 12.4 на старой машине, что я обнаружил, так это то, что используемая библиотека была некорректной. Вы можете скачать правильные библиотеки для этого с. Вам также нужно изменить вашу Java на Oracle Java и следовать инструкциям по настройке этого на Ubuntu, убедитесь, что вы сделаете это сначала.

После этого выполните update-alternatives java и выберите Oracle java для jvm.

Инструкции ниже по ссылке здесь. Я рекомендую сделать это вручную, это научит вас как установить это вручную, что, по справедливости, является гораздо лучшим методом.

https://stackoverflow.com/questions/25729592/how-to-install-jdk-8-in-ubuntu-12-04-using-tar-gz-file

Предпочтительно следуйте этим инструкциям.

Как я могу установить проприетарный Java JDK 6/7/8 или JRE от Sun/Oracle?

Вам также нужно стать членом групп uucp и dial-out, иначе вы не сможете открыть последовательный порт.

Смотрите инструкции по этому ниже.

Как добавить существующего пользователя в существующую группу?

После этого вам понадобится RXTX из интернета, его можно скачать по
http://rxtx.qbang.org/wiki/index.php/Download

Вам нужна версия rxtx 2.1-7r2 (стабильная) для linux.

Откройте zip-файл и следуйте инструкциям.

Когда дело дойдет до установки библиотеки, используйте файл из папки “i686-unknown-linux-gnu” и скопируйте в вашу папку jdk / jvm, как указано, во время входа в систему как root (sudo -i) для доступа к root.

Затем вам, возможно, понадобится IDE.

Мое предложение – Netbeans, просто следуйте инструкциям по установке на linux.

После того как вы сделаете ВСЕ ВЫШЕПЕРЕЧИСЛЕННОЕ “ЭТО ЦЕЛЫЙ ПРОЦЕСС, ПОЭТОМУ НЕ СПЕШИТЕ”.

Вставьте код в Netbeans, создав проект. Это сработало для меня!!

Смотрите пример кода Java по этой ссылке, чтобы лучше понять.

http://playground.arduino.cc/Interfacing/Java

Я использую это для общения с моей платой разработки Arduino, для которой предпочитаю писать собственные интерфейсы.

Вам также нужно будет добавить соответствующий jar-файл в ваш проект, смотрите изображение ниже.

Для этого вам нужно щелкнуть правой кнопкой мыши на библиотеке и сказать IDE, где найти jar-файл rxtxcomm, чтобы вы могли добавить его в проект.

Я имел огромный успех с этим. Кстати, я использую Ubuntu всего 4 недели и уже в полном восторге от этой ОС, она настолько хороша.

Ответ или решение

Ошибка, возникающая при загрузке библиотеки gnu.io.RXTXCommDriver, связана с несколькими проблемами, которые могут возникнуть при работе с RXTX и Java на операционной системе Ubuntu 14.04. В данном ответе мы рассмотрим возможные причины этой ошибки и способы их устранения.

1. Причины ошибки

Основные причины, по которым возникает ошибка java.lang.UnsatisfiedLinkError, включают в себя:

  1. Неверная архитектура библиотеки: Сообщение об ошибке указывает на то, что загруженная библиотека librxtxSerial.so является 32-битной (ELFCLASS32), в то время как вы используете 64-битную версию Java (Java HotSpot(TM) 64-Bit Server VM). Это несоответствие архитектур является распространенной причиной для данной ошибки.

  2. Отсутствие необходимых разрешений: Если ваш пользователь не имеет прав на доступ к серийному порту, приложение может не найти порты, даже если библиотека установлена и загружена корректно.

  3. Неполная или некорректная установка RXTX: Если библиотека RXTX была установлена неправильно, вы можете получить подобные ошибки при вызове ее методов.

2. Решение проблемы

Вот шаги, которые помогут вам устранить проблему:

Шаг 1: Убедитесь в архитектуре библиотек

  1. Проверьте архитектуру вашей Java: Убедитесь, что вы используете версию Java, совместимую с архитектурой вашей системы (64-битная):

    java -version
  2. Замените библиотеку RXTX: Вам нужно загрузить подходящую 64-битную версию RXTX. Вы можете найти ее на официальной странице RXTX. Загрузите rxtx-2.1-7r2 для Linux и убедитесь, что используете библиотеку из папки x86_64-unknown-linux-gnu.

  3. Копирование библиотек: После скачивания и распаковки библиотеки, вам нужно скопировать файлы librxtxSerial.so и RXTXcomm.jar в соответствующие каталоги. Обычно это /usr/lib/jvm/java-8-oracle/jre/lib/amd64/ для библиотеки и /usr/lib/jvm/java-8-oracle/jre/lib/ext/ для jar файла.

Шаг 2: Установка прав доступа

  1. Добавьте своего пользователя в группы dialout и uucp, чтобы иметь возможность работать с серийными портами:

    sudo usermod -a -G dialout,uucp ваше_имя_пользователя
  2. После добавления пользователя в группы обязательно перезагрузите систему или выйдите и зайдите снова.

Шаг 3: Проверка настроек

  1. Проверьте зависимости: Убедитесь, что все зависимости установлены, и библиотека RXTX работает корректно. Для тестирования можно использовать простую программу, которая обращается к серийному порту.

  2. Очистка и настройка IDE: В Eclipse убедитесь, что проект настроен на использование правильных библиотек. Вам нужно добавить RXTXcomm.jar в библиотеки проекта.

Шаг 4: Конфигурация стека

Убедитесь в том, что библиотека librxtxSerial.so поддерживает защиту стека:

execstack -c /usr/lib/jvm/java-8-oracle/jre/lib/amd64/librxtxSerial.so

3. Итог

Следуя вышеуказанным шагам, вы сможете устранить ошибку java.lang.UnsatisfiedLinkError: wrong ELF class: ELFCLASS32 и успешно запустить ваше Java приложение для работы с серийными портами в Ubuntu 14.04. Работа с RXTX может быть немного сложной, но с правильной настройкой вы сможете использовать его для взаимодействия с различными устройствами, такими как Arduino и другими микроконтроллерами.

Оцените материал
Добавить комментарий

Капча загружается...