Вопрос или проблема
Я пытаюсь запустить программу на 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
, включают в себя:
-
Неверная архитектура библиотеки: Сообщение об ошибке указывает на то, что загруженная библиотека
librxtxSerial.so
является 32-битной (ELFCLASS32), в то время как вы используете 64-битную версию Java (Java HotSpot(TM) 64-Bit Server VM). Это несоответствие архитектур является распространенной причиной для данной ошибки. -
Отсутствие необходимых разрешений: Если ваш пользователь не имеет прав на доступ к серийному порту, приложение может не найти порты, даже если библиотека установлена и загружена корректно.
-
Неполная или некорректная установка RXTX: Если библиотека RXTX была установлена неправильно, вы можете получить подобные ошибки при вызове ее методов.
2. Решение проблемы
Вот шаги, которые помогут вам устранить проблему:
Шаг 1: Убедитесь в архитектуре библиотек
-
Проверьте архитектуру вашей Java: Убедитесь, что вы используете версию Java, совместимую с архитектурой вашей системы (64-битная):
java -version
-
Замените библиотеку RXTX: Вам нужно загрузить подходящую 64-битную версию RXTX. Вы можете найти ее на официальной странице RXTX. Загрузите
rxtx-2.1-7r2
для Linux и убедитесь, что используете библиотеку из папкиx86_64-unknown-linux-gnu
. -
Копирование библиотек: После скачивания и распаковки библиотеки, вам нужно скопировать файлы
librxtxSerial.so
иRXTXcomm.jar
в соответствующие каталоги. Обычно это/usr/lib/jvm/java-8-oracle/jre/lib/amd64/
для библиотеки и/usr/lib/jvm/java-8-oracle/jre/lib/ext/
для jar файла.
Шаг 2: Установка прав доступа
-
Добавьте своего пользователя в группы
dialout
иuucp
, чтобы иметь возможность работать с серийными портами:sudo usermod -a -G dialout,uucp ваше_имя_пользователя
-
После добавления пользователя в группы обязательно перезагрузите систему или выйдите и зайдите снова.
Шаг 3: Проверка настроек
-
Проверьте зависимости: Убедитесь, что все зависимости установлены, и библиотека RXTX работает корректно. Для тестирования можно использовать простую программу, которая обращается к серийному порту.
-
Очистка и настройка 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 и другими микроконтроллерами.