- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 JAR 中有一个 Java 应用程序需要使用 JSSC(在 SOPine 板上的 Ubuntu 上)通过串行通信。它抛出以下 java.lang.UnsatisfiedLinkError 异常:
Exception in thread "CommThread" java.lang.UnsatisfiedLinkError: /root/.jssc/linux/libjSSC-2.7_armsf.so: /root/.jssc/linux/libjSSC-2.7_armsf.so: cannot open shared object file: No such file or directory
at java.base/java.lang.ClassLoader$NativeLibrary.load0(Native Method)
at java.base/java.lang.ClassLoader$NativeLibrary.load(ClassLoader.java:2430)
at java.base/java.lang.ClassLoader$NativeLibrary.loadLibrary(ClassLoader.java:2487)
at java.base/java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2684)
at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2617)
at java.base/java.lang.Runtime.load0(Runtime.java:767)
at java.base/java.lang.System.load(System.java:1831)
at jssc.SerialNativeInterface.<clinit>(SerialNativeInterface.java:172)
at jssc.SerialPort.<init>(SerialPort.java:118)
at com.company.comm.transport.serial.CommSerial.initialize(CommSerial.java:51)
at com.company.product.adapters.comm.Communicator.connect(Communicator.java:73)
at com.company.product.services.comm.CommThread.run(CommThread.java:18)
TL;DR:如果您不想阅读几天的疑难解答,请跳至答案。
我在 Eclipse 中导出我的 JAR 文件,并将 jssc.jar 添加到类路径中项目的 Java 构建路径的库中,并将其包含在导出的条目中。
我确认文件 libjSSC-2.7_armsf.so 在那里:
sudo ls –la /root/.jssc/linux/
drwxr-xr-x 2 root root 4096 Sep 23 14:41 .
drwxr-xr-x 3 root root 4096 Sep 20 15:39 ..
-rw-r--r-- 1 root root 10539 Sep 20 15:39 libjSSC-2.7_armsf.so
我能找到的与我的问题最接近的答案是 Stack Overflow 问题 unsatisfied link error runnable jar referencing jssc library .我确认我正在使用的 SOPine 板有一个 VFPv4 Floating Point Unit ,包含目录/lib/arm-linux-gnueablhf/,我安装了 JDK bellsoft-java11:armhf(来自 dpkg -l),所以我不清楚它为什么使用 libjSSC-2.7_armsf .so 而不是 libjSSC-2.7_armhf.so,后者位于同一个 jssc.jar 中。
我尝试在/root/.jssc/linux/目录下添加libjSSC-2.7_armhf.so,安装libjssc-java到linux,修改LD_LIBRARY_PATH和-Djava.library.path为指向另一个目录,但它抛出相同的异常,它无法找到 libjSSC-2.7_armsf.so。
我正在使用以下命令以 pine 用户运行 JAR 文件:
sudo java -jar product-0.1.0.jar &> output-0.1.0_1.txt
编辑 10/2/2019:我试图通过删除 libjSSC-2.7_armsf.so 来更改它正在使用的 JSSC 共享库,使用 sudo apt install libjssc-java
在本地安装 jssc,并使用 LD_LIBRARY_PATH 和 -Djava.library.path 来关注我的程序正在运行新库,但它仍在请求 libjSSC-2.7_armsf.so。我打算将 Eclipse 项目配置为不将 JSSC JAR 文件与我的项目导出的 JAR 文件打包,然后尝试再次运行它。
编辑 10/7/2019:上周,我决定创建一个简单的 HelloSerial.java 程序来减少潜在的依赖性。代码如下:
import jssc.SerialPortList;
public class HelloSerial {
static {
System.out.println("HelloSerial: loading JSSC");
try {
System.load("/root/.jssc/linux/libjSSC-2.7_armhf.so");
System.out.println("HelloSerial: loading JSSC");
} catch (UnsatisfiedLinkError e) {
System.err.println("Native core library failed to load.\n" + e);
System.exit(1);;
}
}
public static void main(String[] args) {
System.out.println("HelloSerial: start");
String[] portNames = SerialPortList.getPortNames();
System.out.println("HelloSerial: listing " + portNames.length + " port names");
for(int i = 0; i < portNames.length; i++){
System.out.println(portNames[i]);
}
System.out.println("HelloSerial: end");
}
}
这是在 Linux 系统中编译和运行它的输出:
$ sudo javac -classpath .:jssc.jar HelloSerial.java
$ sudo java -cp jssc.jar:. HelloSerial
HelloSerial: loading JSSC
HelloSerial: loading JSSC
HelloSerial: start
Exception in thread "main" java.lang.UnsatisfiedLinkError: /root/.jssc/linux/libjSSC-2.7_armsf.so: /root/.jssc/linux/libjSSC-2.7_armsf.so: cannot open shared object file: No such file or directory
at java.base/java.lang.ClassLoader$NativeLibrary.load0(Native Method)
at java.base/java.lang.ClassLoader$NativeLibrary.load(ClassLoader.java:2430)
at java.base/java.lang.ClassLoader$NativeLibrary.loadLibrary(ClassLoader.java:2487)
at java.base/java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2684)
at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2617)
at java.base/java.lang.Runtime.load0(Runtime.java:767)
at java.base/java.lang.System.load(System.java:1831)
at jssc.SerialNativeInterface.<clinit>(SerialNativeInterface.java:172)
at jssc.SerialPortList.<clinit>(SerialPortList.java:43)
at HelloSerial.main(HelloSerial.java:20)
即使我明确使用 System.load 来加载共享库的硬浮点版本,它仍然默认尝试使用软浮点。是什么迫使它使用软 float 版本?所有库(包括 JDK)都使用 armhf、arm64 或全部使用 dpkg -l
。
编辑 10/8/2019:我发现 JSSC 在其 SerialNativeInterface 中使用逻辑类来确定要使用哪个共享库(这只是显示相关的代码行):
79 static {
80 String libFolderPath;
81 String libName;
82
83 String osName = System.getProperty("os.name");
84 String architecture = System.getProperty("os.arch");
85 String userHome = System.getProperty("user.home");
86 String fileSeparator = System.getProperty("file.separator");
87 String tmpFolder = System.getProperty("java.io.tmpdir");
...
118 else if(architecture.equals("arm")) {//since 2.1.0
119 String floatStr = "sf";
120 >>>> if(javaLibPath.toLowerCase().contains("gnueabihf") || javaLibPath.toLowerCase().contains("armhf")){
121 floatStr = "hf";
122 }
123 else {
...
139 }
140 architecture = "arm" + floatStr;
141 }
142
143 libFolderPath = libRootFolder + fileSeparator + ".jssc" + fileSeparator + osName;
144 libName = "jSSC-" + libVersion + "_" + architecture;
145 libName = System.mapLibraryName(libName);
重要的部分在第 120 行,根据 java.library.path 是否包含 gnueabihf 或 armhf 路径,选择 ARM 的库是软浮点还是硬浮点。包括以下代码行会显示这些路径:
System.out.println("HelloSerial: java.library.path " + System.getProperty("java.library.path"));
这输出:
HelloSerial: java.library.path /usr/java/packages/lib:/lib:/usr/lib
看起来像 /lib/gnueabihf
这样的 gnueabihf 或 armhf 路径没有被使用,所以我需要添加一个作为占位符。
使用 sudo java -D.java.library.path=".:/lib/gnueabihf"-jar HelloSerial-1.0.0.jar
有效。
我会看看将来是否可以将 /lib/gnueabihf
永久添加到 java.library.path 中。
最佳答案
JSSC 在其 SerialNativeInterface 中使用逻辑类来确定要使用哪个共享库。对于具有 ARM 架构的操作系统,它会检查 java.library.path 以查看路径中是否包含 gnueabihf 或 armhf。如果没有,它将改用 soft float 共享库。
我当前的 java.library.path 不包含任何一个,所以我使用以下命令将现有的 /lib/gnueabihf
目录添加到路径中:
$ sudo java -D.java.library.path=".:/lib/gnueabihf" -jar HelloSerial-1.0.0.jar
this article 中列出了其他加载路径的方法或者您可以在线搜索该信息。您可以使用 $ java -XshowSettings:properties
来确认它包含在 java.library.path 中。
关于java - 如何修复 JSSC 的 java.lang.UnsatisfiedLinkError? (需要硬 float ?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58118965/
算力时代,视频云需要怎样的 CPU? 在数据爆发式增长及算法日益精进的大背景下,属于「算力」的时代俨然到来。随着视频成为互联网流量的主角,日趋饱和的音视频场景渗透率、人类对“感官之限”的追
我正在使用 keras 开发深度网络。有一个激活“硬 sigmoid”。它的数学定义是什么? 我知道什么是 Sigmoid。有人在Quora上问了类似的问题:https://www.quora.com
我有一个不寻常的 SQL 问题,我不太确定如何最好地解释,所以请耐心等待。我有三张表,一张是志愿者组织的表,一张是用户的表,一张是用户详细信息的表。 #Table 1# ## Name Preside
我正在尝试使用名为 bigText 的 jquery 插件。一个很棒的用于创建 block 头的插件。如果您想将其与自定义字体一起使用,它会声明您需要 google webfont loader,这样
假设我有一张 table date,personid 1/1/2001 1 1/2/2001 3 1/3/2001 2 1/4/2001 2 1/5/2001 5 1/6/2001 5 1/7/200
下面是我要执行的 SQL。我想避免为此执行多个请求,我很确定这是可能的…… First table : products_categories (category_id, category_infos
我在 android studio 中重新设置了一些提交,并选择了硬重置类型。我失去了一个星期的工作。是否有希望撤销此操作?我正在使用 android studio,它有内置的 GUI 选项来执行所有
当我使用我的交叉工具链编译 C 代码时,链接器会打印出警告页面,说明我的可执行文件使用了硬 float ,但我的 libc 使用了软 float 。有什么区别? 最佳答案 硬浮点使用片上浮点单元。软
linux系统有arm64,arm架构armv8-a。如何知道 debian 是运行硬浮点还是软浮点? 最佳答案 符合 AAPCS64, GNU GCC for armv8 仅提供硬浮点 aarch6
我正在开发 cortex-m3 的微内核。我创建了一个故意导致错误的小型测试应用程序。 现在我不确定如何从故障中返回。我知道堆栈可能需要使用不同函数的地址进行更新。我也知道在某些情况下从错误返回可能是
硬/软 限制是什么意思? 核心文件大小的差异例如: ulimit -Sc 1024 与 ulimit -Hc 1024 我通常在运行二进制文件之前将脚本放入 ulimit -c unlimited。
我想在 Java 中加载一个 MSCAPI keystore 并检查 MY 存储中的可用证书。但是,这些证书的一些 key 驻留在硬件 token 上,并且弹出窗口会在加载期间询问 token 。 有
是的,这是一个有点棘手的问题; 一个数组(没有副本),而不是任何奇数数组。让我解释一下,让我们从这里开始; $a = array ( 'one' => 1, 'two' => 2, 'three' =
我需要在运行 Ubuntu 12.04 的 BeagleBoard xM rev C 上运行一个使用 ftd2xx 的程序。我正在尝试使用提供的 ARM 库 libftd2xx.so here . l
我是一名优秀的程序员,十分优秀!