Java 在资源路径中找不到JNA本机支持(/com/sun/JNA/linux arm/libjnidispatch.so)

Java 在资源路径中找不到JNA本机支持(/com/sun/JNA/linux arm/libjnidispatch.so),java,jna,raspberry-pi,Java,Jna,Raspberry Pi,我已经开始构建一个java服务,其中包含JNA以加载本机C/C++库,我希望在Raspberry PI又名arm平台上运行java服务。我已经成功地建立了一个稳定的服务平台,它可以在Windows7和linux-amd64/debian上运行,但是。。在RPI平台上,我得到上述错误: 线程“main”java.lang.UnsatifiedLinkError中出现异常:在资源路径中找不到JNA本机支持(/com/sun/JNA/linux arm/libjnidspatch.so) 在RPI上,

我已经开始构建一个java服务,其中包含JNA以加载本机C/C++库,我希望在Raspberry PI又名arm平台上运行java服务。我已经成功地建立了一个稳定的服务平台,它可以在Windows7和linux-amd64/debian上运行,但是。。在RPI平台上,我得到上述错误: 线程“main”java.lang.UnsatifiedLinkError中出现异常:在资源路径中找不到JNA本机支持(/com/sun/JNA/linux arm/libjnidspatch.so)

在RPI上,我已完成以下工作: *安装了openjdk7和java8测试版,支持arm硬浮动。 *已安装libjnajavalib

设置了以下内容:

Java

root@pisces:/opt/TellstickReplay# java -version
java version "1.8.0-ea"
Java(TM) SE Runtime Environment (build 1.8.0-ea-b36e)
Java HotSpot(TM) Client VM (build 25.0-b04, mixed mode)
root@pisces:/opt/TellstickReplay#
LD\u库路径

root@pisces:/opt/TellstickReplay# echo $LD_LIBRARY_PATH
/opt/lib/jna
root@pisces:/opt/TellstickReplay# echo $CLASSPATH
/usr/lib/jna
类路径

root@pisces:/opt/TellstickReplay# echo $LD_LIBRARY_PATH
/opt/lib/jna
root@pisces:/opt/TellstickReplay# echo $CLASSPATH
/usr/lib/jna
所有设置似乎都不满足JAVA对JNA的支持。我甚至尝试将jna.jar和linux-arm.jar都导出到Eclipse中的项目中,并一起将jar重新构建到导出的jar中,但仍然得到相同的错误。导出的jar已在windows和linux上成功测试,因此jar文件正常工作

我还尝试在jar文件的清单中使用CLASSPATH,但没有成功。我还尝试从绝对路径显式加载libjnidispatch.so,但JAVA随后开始抱怨找不到libjnidispatch.so的文件,即使路径是100%正确的


所以。。有人知道如何在Raspberry PI平台上正确获得JNA支持吗??拜托,我感到非常沮丧,很快就放弃了解决这个问题的希望。

我想说的更多的是“libjnidspatch的位置配置出现了小故障。”“在您使用的操作系统或特定的JRE系统内部文件夹/包/JNDI结构中,它可能不是相同布局的Debian或Java JRE。

libjnidspatch.so在您的系统上的位置是什么?如果它不在您的系统上,JNA将尝试从指定的资源路径从JNA.jar解包它。如果它也不在那里,您将得到
未满足链接错误

建议尽可能在系统上显式安装libjnidispatch.so;jar绑定主要是为了方便在更常见的桌面平台上使用


linux arm.jar
包含libjnidispatch.so的最新版本,但只有WebStart知道如何从这样的jar自动加载本机。如果将其解包到/opt/lib/jna(或LD_LIBRARY_路径上的其他地方),应该避免链接错误。

我打包了新的jna.jar(4.0),其中包括linux arm/libjnidispatch.so。我尝试运行的代码现在运行正常。

我正在为RPI2重新编译,我已经花了几天时间来解决这个问题。然后我找到了最简单的解决办法。您所需要的只是默认JVM的本机lib路径中的libjnidispatch.so链接

sudo -s ln -s /usr/lib/arm-linux-gnueabihf/jni/libjnidispatch.so /usr/lib/jvm/default-java/jre/lib/arm/libjnidispatch.so
我做了以下工作:

  • sudo apt get安装libjna java
  • 获取已安装的jar/usr/share/java/jna.jar
  • 将jna.jar作为maven依赖项安装

  • 他们为我工作过…

    libjnidispatch.so的可能候选文件位于CLASSPATH、LD_LIBRARY_路径和/usr/libs/jna中的文件系统中。错误消息表明jna试图在通过
    System.loadLibrary()
    加载失败后从jna.jar解压它。您可以将系统属性
    jna.boot.library.path
    设置为/usr/libs/jna,但如果LD_library_path已经包含该路径,则不必这样做(请注意,在您的问题中,您将其设置为/*opt/lib*/jna,如果库实际位于/*usr/libs*/jna中,则会导致错误)。您提到system.loadLibrary()虽然我读过关于JNA使用Native.loadLibrary()的文章,但通过查看JNA,我找不到System.loadLibrary()。这两者之间是否存在显著差异?是否存在一个Raspbian图像,其中JNA是开箱即用的?我一直在寻找一个解决办法这么长时间,我不能真正激励找到这个问题的根源。我发现了问题。JNA.jar实际上缺少
    libjnidspatch.so
    JNA.jar
    中,所以我用Ant在Raspberry Pi上用openjdk6构建
    JNA.jar,这就解决了问题。奇怪的是,用
    -Djna.boot.libar.path=/path/to/libjnidispatch.so
    链接仍然得到了
    不满意的链接错误。哦,好吧,现在可以了=)非常感谢您的参与和投入!!它几乎成功了,我发现Elasticsearch 7.1.0至少需要5.2.0版本的libjna jni,Raspberry Pi的最新版本是4.2.2。对我有效的解决方案是找到相关的libjni.*.so库文件并将其添加到jna.x.x.ja文件中。