【问题标题】:Unable to load JNI related app on Raspberry Pi无法在 Raspberry Pi 上加载 JNI 相关应用程序
【发布时间】:2016-04-05 22:47:33
【问题描述】:

我已经编译了一个在我的 Mac OS 机器上运行良好的 Java 应用程序 (JAR)。它使用 JNI 调用已编译的 C-Shared 库并使用 jnr-ffi 加载该本机代码。

我收到一堆错误,这些错误源于 jnr-ffi 尝试初始化。看起来应该有一些 jni 文件应该作为 Java 安装的一部分存在于系统上,但它们不存在。

我无法逐字复制堆栈跟踪,但这里有一些错误应该会有所帮助:

    Exception in thread "main" j.l.UnsatisfiedLinkError: could not load FFI provider jnr.ffi.provider.jffi.provider


Another unsatisfied link error below: /tmp/...gibberish..so cannot open shared object file: no such file or directory.

Another unsatisfied link error: Can't load library: /usr/lib/libjffi-1.2so

基本上是一堆与加载本机代码有关的错误。

我提取了我试图运行的 JAR 也是毫无价值的,它包含一堆文件夹,如 arm-LinuxDarwini386-Linux 和文件 libjffi-1.2.so 所以看起来就像 JAR 中存在的文件一样,但在运行时,jave 无法找到它们。

我不知道如何解决这个问题,但它在我的另一台机器上运行。如何解决?

我已尝试使用sudo 运行。

【问题讨论】:

    标签: java


    【解决方案1】:

    当您运行 JVM 时,它会查找本机库并尝试加载它。不幸的是,本机库在编译时不可移植,这就是您尝试运行的软件提供为不同架构编译的相同库的原因。

    您需要的树莓派是arm-Linux

    您只需要弄清楚 JVM 用于加载库的路径是什么,然后通过命令行配置软件以加载正确的路径,或者将您在 mac 中使用的路径替换为编译的路径ARM。

    【讨论】:

    • 谢谢,我会试试的。但是,使用随机 filename.so 搜索 /tmp 目录是怎么回事?
    • 异常中的搜索路径之一,是有效路径。为什么会这样?
    • Java 有临时文件夹的概念。在 java 源代码中,程序员可能正在尝试将库解析到该源代码上。它可能会尝试解压缩 tmp 文件夹中包含库的某些存档,但由于存档不存在,因此提取的文件将不存在。 (只是在这里色调)
    • 我想知道为什么临时文件夹了。当您尝试从 jar 加载本机库(您的库可能包含在 jar 中)时,您首先必须将其复制到临时文件夹中然后使用它。见:stackoverflow.com/questions/4691095/…
    • 谢谢,但我正在使用的库(不是我的)已经在使用 tmp 文件夹做这些事情了。
    猜你喜欢
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    相关资源
    最近更新 更多