cuốn sách gpt4 ai đã làm

Làm cách nào để sửa lỗi java.lang.UnsatisfiedLinkError của JSSC? (yêu cầu phao cứng?)

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 09:58:42 25 4
mua khóa gpt4 Nike

Tôi có một ứng dụng Java trong JAR cần giao tiếp qua nối tiếp bằng JSSC (trên Ubuntu trên bảng SOPine). Nó ném ngoại lệ java.lang.UnsatisfiedLinkError sau:

Ngoại lệ trong chuỗi "CommThread" java.lang.UnsatisfiedLinkError: /root/.jssc/linux/libjSSC-2.7_armsf.so: /root/.jssc/linux/libjSSC-2.7_armsf.so: không thể mở tệp đối tượng được chia sẻ: Không như vậy tập tin hoặc thư mục
tại java.base/java.lang.ClassLoader$NativeLibrary.load0(Phương thức gốc)
tại java.base/java.lang.ClassLoader$NativeLibrary.load(ClassLoader.java:2430)
tại java.base/java.lang.ClassLoader$NativeLibrary.loadLibrary(ClassLoader.java:2487)
tại java.base/java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2684)
tại java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2617)
tại java.base/java.lang.Runtime.load0(Runtime.java:767)
tại java.base/java.lang.System.load(System.java:1831)
tại jssc.SerialNativeInterface.(SerialNativeInterface.java:172)
tại jssc.SerialPort.(SerialPort.java:118)
tại com.company.comm.transport.serial.CommSerial.initialize(CommSerial.java:51)
tại com.company.product.adapters.comm.Communicator.connect(Communicator.java:73)
tại com.company.product.services.comm.CommThread.run(CommThread.java:18)

TL;DR: Nếu bạn không muốn đọc số ngày khắc phục sự cố, hãy bỏ qua câu trả lời.


Tôi đã xuất tệp JAR của mình trong Eclipse và thêm jssc.jar vào thư viện trong đường dẫn lớp của đường dẫn xây dựng Java của dự án và đưa nó vào mục đã xuất.

Tôi đã xác nhận rằng tệp libjSSC-2.7_armsf.so có ở đó:

sudo ls –la /root/.jssc/linux/
gốc drwxr-xr-x 2 4096 23 tháng 9 14:41 .
drwxr-xr-x 3 gốc gốc 4096 20 tháng 9 15:39 ..
-rw-r--r-- 1 gốc 10539 Ngày 20 tháng 9 15:39 libjSSC-2.7_armsf.so

Câu trả lời gần nhất tôi có thể tìm thấy cho câu hỏi của mình là câu hỏi về Stack Overflow này lỗi liên kết không hài lòng có thể chạy được jar tham chiếu thư viện jssc .Tôi xác nhận rằng bảng SOPine tôi đang sử dụng có Đơn vị dấu phẩy động VFPv4 , bao gồm thư mục /lib/arm-linux-gnueablhf/, tôi đã cài đặt JDK bellsoft-java11:armhf (từ dpkg -l), vì vậy tôi không chắc tại sao nó lại sử dụng libjSSC-2.7_armsf .so thay vì libjSSC-2.7_armhf.so, nằm trong cùng jssc.jar.

Tôi cố gắng thêm libjSSC-2.7_arm vào thư mục /root/.jssc/linux/hf.so, đã cài đặt libjssc-java cho linux, sửa đổi LD_LIBRARY_PATH và -Djava.library.path để trỏ đến một thư mục khác, nhưng nó ném ra ngoại lệ tương tự, nó không thể tìm thấy libjSSC-2.7_armsf.Vì thế.

Tôi đang sử dụng lệnh sau để chạy tệp JAR với tư cách người dùng thông:

sudo java -jar sản phẩm-0.1.0.jar &> đầu ra-0.1.0_1.txt

Chỉnh sửa ngày 2/10/2019:Tôi đã cố gắng thay đổi thư viện chia sẻ JSSC mà nó đang sử dụng bằng cách xóa libjSSC-2.7_armsf.so, sử dụng sudo apt cài đặt libjssc-java Cài đặt jssc cục bộ và sử dụng LD_LIBRARY_PATH và -Djava.library.path để theo dõi chương trình của tôi đang chạy thư viện mới nhưng nó vẫn yêu cầu libjSSC-2.7_armsf.so. Tôi sẽ định cấu hình dự án Eclipse để không đóng gói tệp JAR JSSC bằng tệp JAR do dự án của tôi xuất và sau đó thử chạy lại nó.

Chỉnh sửa 7/10/2019:Tuần trước, tôi quyết định tạo một chương trình HelloSerial.java đơn giản để giảm bớt sự phụ thuộc tiềm ẩn. Mã này như sau:

nhập jssc.SerialPortList;

lớp công khai HelloSerial {

tĩnh {
System.out.println("HelloSerial: đang tải JSSC");
thử {
System.load("/root/.jssc/linux/libjSSC-2.7_armhf.so");
System.out.println("HelloSerial: đang tải JSSC");
} bắt (UnsatisfiedLinkError e) {
System.err.println("Không tải được thư viện lõi gốc.\n" + e);
System.exit(1);;
}
}

public static void main(String[] args) {
System.out.println("HelloSerial: start");

Chuỗi[] portNames = SerialPortList.getPortNames();
System.out.println("HelloSerial: liệt kê " + portNames.length + " tên cổng");
for(int i = 0; i < portNames.length; i++){
System.out.println(portNames[i]);
}

System.out.println("HelloSerial: end");
}
}

Đây là kết quả của quá trình biên dịch và chạy nó trên hệ thống Linux:

$ sudo javac -classpath .:jssc.jar HelloSerial.java
$ sudo java -cp jssc.jar:.HelloSerial
HelloSerial: đang tải JSSC
HelloSerial: đang tải JSSC
HelloSerial: bắt đầu
Ngoại lệ trong luồng "chính" java.lang.UnsatisfiedLinkError: /root/.jssc/linux/libjSSC-2.7_armsf.so: /root/.jssc/linux/libjSSC-2.7_armsf.so: không thể mở tệp đối tượng dùng chung: Không như vậy tập tin hoặc thư mục
tại java.base/java.lang.ClassLoader$NativeLibrary.load0(Phương thức gốc)
tại java.base/java.lang.ClassLoader$NativeLibrary.load(ClassLoader.java:2430)
tại java.base/java.lang.ClassLoader$NativeLibrary.loadLibrary(ClassLoader.java:2487)
tại java.base/java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2684)
tại java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2617)
tại java.base/java.lang.Runtime.load0(Runtime.java:767)
tại java.base/java.lang.System.load(System.java:1831)
tại jssc.SerialNativeInterface.(SerialNativeInterface.java:172)
tại jssc.SerialPortList.(SerialPortList.java:43)
tại HelloSerial.main(HelloSerial.java:20)

Mặc dù tôi sử dụng System.load một cách rõ ràng để tải phiên bản dấu phẩy động cứng của thư viện dùng chung, nhưng nó vẫn cố gắng sử dụng dấu phẩy động mềm theo mặc định. Điều gì buộc nó phải sử dụng phiên bản float mềm? Tất cả các thư viện (bao gồm cả JDK) đều sử dụng armhf, arm64 hoặc cả hai dpkg -l.

Chỉnh sửa ngày 8/10/2019:Tôi tìm thấy JSSC trong đó Giao diện gốc nối tiếp Sử dụng lớp logic để xác định thư viện dùng chung nào sẽ sử dụng (phần này chỉ hiển thị các dòng mã có liên quan):

79 tĩnh {
80 chuỗi libFolderPath;
81 Chuỗi libName;
82
83 Chuỗi osName = System.getProperty("os.name");
84 Kiến trúc chuỗi = System.getProperty("os.arch");
85 Chuỗi userHome = System.getProperty("user.home");
86 Chuỗi fileSeparator = System.getProperty("file.separator");
87 Chuỗi tmpFolder = System.getProperty("java.io.tmpdir");
...
118 else if(architecture.equals("arm")) {//kể từ 2.1.0
119 Chuỗi floatStr = "sf";
120 >>>> if(javaLibPath.toLowerCase().contains("gnueabihf") || javaLibPath.toLowerCase().contains("armhf")){
121 floatStr = "hf";
122 }
123 cái khác {
...
139 }
Kiến trúc 140 = "cánh tay" + floatStr;
141 }
142
143 libFolderPath = libRootFolder + fileSeparator + ".jssc" + fileSeparator + osName;
144 libName = "jSSC-" + libVersion + "_" + kiến ​​trúc;
145 libName = System.mapLibraryName(libName);

Phần quan trọng nằm ở dòng 120. Tùy thuộc vào việc java.library.path có chứa đường dẫn gnueabihf hay armhf hay không, hãy chọn xem thư viện ARM là dấu phẩy động mềm hay dấu phẩy động cứng. Bao gồm các dòng mã sau sẽ hiển thị các đường dẫn này:

System.out.println("HelloSerial: java.library.path" + System.getProperty("java.library.path"));

Đầu ra này:

HelloSerial: java.library.path /usr/java/packages/lib:/lib:/usr/lib

看起来像 /lib/gnueabihf Các đường dẫn gnueabihf hoặc armhf như vậy không được sử dụng, vì vậy tôi cần thêm một đường dẫn làm phần giữ chỗ.

sử dụng sudo java -D.java.library.path=".:/lib/gnueabihf"-jar HelloSerial-1.0.0.jar có hiệu quả.

Tôi sẽ xem liệu trong tương lai tôi có thể thêm /lib/gnueabihf Đã thêm vĩnh viễn vào java.library.path.

câu trả lời hay nhất

JSSC trong đó Giao diện gốc nối tiếp Sử dụng các lớp logic để xác định thư viện dùng chung nào sẽ sử dụng. Đối với hệ điều hành có kiến ​​trúc ARM, nó sẽ kiểm tra java.library.path để xem đường dẫn có chứa gnueabihf hoặc armhf hay không. Nếu không, nó sẽ sử dụng thư viện chia sẻ float mềm để thay thế.

Java.library.path hiện tại của tôi không chứa cả hai, vì vậy tôi đã sử dụng lệnh sau để chuyển đổi tệp hiện có /lib/gnueabihf Thư mục được thêm vào đường dẫn:

$ sudo java -D.java.library.path=".:/lib/gnueabihf" -jar HelloSerial-1.0.0.jar

bài viết này Các phương pháp tải đường dẫn khác được liệt kê trong hoặc bạn có thể tìm kiếm thông tin đó trực tuyến. Bạn có thể sử dụng $ java -XshowSinstall: thuộc tính để xác nhận rằng nó được bao gồm trong java.library.path.

Giới thiệu về java - Làm cách nào để sửa lỗi java.lang.UnsatisfiedLinkError cho JSSC? (cần hard float?), chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/58118965/

25 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress